Что такое регулярное выражение PHP для таргетинга определенных URL? - PullRequest
1 голос
/ 30 ноября 2010

У меня есть некоторый базовый HTML, который я называю str_replace(), мне нужно добавить все URL-адреса, найденные в строке HTML, с помощью 'generate_book.php?link=', но мне нужно исключить любые внешние ссылки, например;

<a href="gst/3.html">Link</a> - это должно стать - <a href="generate_book.php?link=gst/3.html"></a>

<a href="http://example.com">Link</a> - это следует оставить в покое

Ваш мозг ценится!

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Сначала вы захотите использовать предварительный просмотр, чтобы убедиться, что он не соответствует HTTP или HTTPS. Вы также можете добавить mailto, если вас это беспокоит.

$str = preg_replace("/(?<=href=\")(?!http:\/\/|https:\/\/)([^\"]+)/i", "generate_book.php?link=$1", $str);

В этом регулярном выражении также используется заглядывание ((?<=href=\")), так что оно фактически не соответствует href=".

Предупреждения:

  • Необходимо знать, какие схемы URL будут в HTML помимо HTTP и HTTPS, если таковые имеются.
  • Некоторые теги, такие как тег link, также имеют атрибут href. Убедитесь, что вы не заменяете их. Если вам нужно сопоставлять только теги A с помощью регулярных выражений, ваша сложность регулярных выражений значительно возрастет, и все же не будет действительно безопасным.
  • Regex Eval намного менее эффективен и небезопасен, но если вам нужно кодирование URL, вы можете попытаться закодировать его URL во время замены, как это делает второй возврат другого ответа.
  • В целом, Regex не обязательно является лучшим решением для этого. Вам может быть лучше с парсером HTML ...
0 голосов
/ 30 ноября 2010

Попробуйте:

$str = preg_replace(
    "(href=\"([^\"]+)\")ie",
    "if(substr('$1',0,7) == 'http://')
        return stripslashes('$1');
     else
        return 'generate_book.php?link='.urlencode(stripslashes('$1'));",
    $str);
...