регулярное выражение не соответствует, что я делаю не так?

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;

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

Заранее благодарю за ваше время

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

Теги:

2 ответа

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_]

0

Попробуйте:

$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;

И проверить ЗДЕСЬ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню