Ну, вы говорите, что хотите заполнить $testVal
извлеченным веб-адресом, но вы используете preg_replace
вместо preg_match
. Вы используете preg_replace
, когда хотите заменить вхождений, и используете preg_match
(или preg_match_all
), когда хотите найти вхождений.
Если вы хотите заменить URL-адреса ссылками (тегами <a>
), как в вашем примере, используйте что-то вроде этого:
<?php
$testVal = preg_replace(
'/((?:https?:\/\/|ftp:\/\/|irc:\/\/)[^\s<>()"]+?(?:\([^\s<>()"]*?\)[^\s<>()"]*?)*)((?:\s|<|>|"|\.||\]|!|\?|,|,|")*(?:[\s<>()"]|$))/',
'<a target="_blank" rel="nofollow" href="$1">$1</a>$2',
$testVal
);
Если вы хотите вместо этого просто найти URL-адрес из строки, попробуйте (используя ваше регулярное выражение вместо моего выше):
<?php
$testVal = $node->field_link[0]['view'];
if(!preg_match("#((http|https|ftp)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)#ie", $testVal, $matches)) {
echo "Not found!";
else {
echo "URL: " . $matches[1];
}
Когда вы используете preg_match
, третий (необязательный) параметр заполняется результатами поиска. $matches[0]
будет содержать строку, которая соответствует всему шаблону, $matches[1]
будет содержать первую группу захвата, $matches[2]
- вторую и т. Д.