Я пытаюсь сделать замену между строкой, содержащей ссылку, с той же строкой, инкапсулированной в 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, и вся строка выделяется, когда я тестирую... так что мне действительно интересно, что я делаю неправильно.
Например, ваше регулярное выражение:
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_]
Попробуйте:
$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;