2014-11-09 1 views
0

Я пытаюсь сделать замену между строкой, содержащей ссылку, с той же строкой, инкапсулированной в html href blocks. Я новичок в регулярных выражениях и читаю на них - я придумал это выражение, проходящее через SO и другие сайты.Регулярное выражение не соответствует, что я делаю неправильно?

$s = 'This is a stupid site: www.etsy.com'; 
$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+\.com|\.net|\.org|\.ca)|(/[a-zA-Z0-9/?\-_&=\.]+)#'; 
$ret = preg_replace($regEx, "<a href='$1$2$3'>$1$2$3</a>", $s); 
echo $ret; 

Это не возвращает мне ссылку на все

и это не относится к «HTTP: //» в ссылке:

$s = 'This is a stupid video http://www.youtube.com/watch?v=MkXVM6ad9nI'; 
$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+\.com|\.net|\.org|\.ca)|(/[a-zA-Z0-9/?\-_&=\.]+)#'; 
$ret = preg_replace($regEx, "<a href='$1$2$3'>$1$2$3</a>", $s); 
echo $ret; 

Я все еще пытаюсь так это может измениться ... но любая помощь будет оценена по мере того, как я приближаюсь к концу своего ума.

Заранее спасибо за ваше время

P.S: Я попробовал это в RegexBuddy и вся строка подсвечивается, когда я тест ... так что я на самом деле интересно, что я делаю неправильно.

+2

'^' закрепляет начало строки или весь предмет строки. – mario

+1

Что вы делаете неправильно, так это то, что вы пытаетесь разобрать HTML с регулярными выражениями, что невозможно, поскольку HTML не является обычным языком. Вместо этого используйте парсер HTML. –

+0

@ TheParamagneticCroissant: Он пытается разобрать URL-адрес. –

ответ

0

Try с:

$s = 'This is a stupid site: www.etsy.com'; 
$regEx = '#(www\.|http://)([a-zA-Z0-9\/?\-&=_\.]+\.com|\.net|\.org|\.ca)(/[a-zA-Z0-9/?\-_&=\.]*)?#'; 
$ret = preg_replace($regEx, "<a href='$1$2$3'>$1$2$3</a>", $s); 
echo $ret; 

And test HERE

0

ваших регулярных выражений спичек, например:

www.whatever.com 

или

www.net 

но не

www.whatever.net 

Вы должны группам ДВОЙ:

$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+(\.com|\.net|\.org|\.ca))|(/[a-zA-Z0-9/?\-_&=\.]+)#'; 
//           here __^ and   here __^ 

Вы также мог бы упростить:

$regEx = '#^((?:www\.|http://)[\w/.-]+\.(?:com|net|org|ca))#'; 
$ret = preg_replace($regEx, "<a href='$1'>$1</a>", $s); 

Где:

(?:...) не является группой захвата.
\w обозначает [a-zA-Z0-9_]

Смежные вопросы