Изо всех сил пытается использовать функцию регулярного выражения, чтобы найти ссылку в строке - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь извлечь строку из другой строки, используя php.

На данный момент я использую:

<?php
  $testVal = $node->field_link[0]['view'];
  $testVal = preg_replace("#((http|https|ftp)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)#ie", "'<a href=\"$1\" target=\"_blank\">$3</a>$4'", $testVal);
  print "testVal = ";
  print $testVal;
?>

Кажется, сейчас печатается вся моя строка.

Теперь я хочу: извлечь веб-адрес, если он есть, и сохранить его как переменную с именем testVal.

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

для @ bos

Введите:

<iframe width="560" height="315" src="http://www.youtube.com/embed/CLXt3yh2g0s" frameborder="0" allowfullscreen></iframe>

Желаемый выход

http://www.youtube.com/embed/CLXt3yh2g0s

1 Ответ

0 голосов
/ 20 марта 2012

Ну, вы говорите, что хотите заполнить $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|<|>|"|\.||\]|!|\?|,|&#44;|&quot;)*(?:[\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] - вторую и т. Д.

...