【问题标题】:Parse links, except for links inside a src=""解析链接,除了 src="" 内的链接
【发布时间】:2011-04-26 01:30:32
【问题描述】:

我得到了以下代码,它用相应的链接替换了 URL:

$in = array
(
        '/(?:^|\b)((((http|https|ftp):\/\/)|(www\.))([\w\.]+)([,:%#&\/?=\w+\.-]+))(?:\b|$)/is'
);
$out = array
(
        "<a href=\"$1\" target=\"_blank\">$1</a>"
);
return preg_replace($in, $out, $url);

但是,我不希望 SRC="url" 属性中的 URL 被转换为链接。

如何从该模式中排除包含在属性中的 URL?

更新: 输入将是:

Bellow you can see http://www.yahoo.com bla bla
<iframe src="http://yahoo.com"></frame

它需要解析第一个链接,而不是 src="" 中的 URL

【问题讨论】:

  • 这就是为什么您不使用正则表达式来处理 HTML 等不规则语言的原因。
  • 但不能排除以 >" 开头的链接
  • @deceze 你用什么?我知道在这种情况下还有很多其他选择,但是说不应该在 HTML 上使用正则表达式有点笼统。
  • 我只需要转换前面没有>"的链接

标签: php regex pattern-matching


【解决方案1】:

使用此 php 代码提取除src="" 之外的链接

<?php
   $p = '/((<)(?(2).*?src=[^>]*>).*?)*?((?:(?:(?:http|https|ftp):\/\/)|(?:www\.))(?:[\w\.]+)(?:[,:%#&\/?=\w+\.-]+))/smi';

   // multi-line input text
   $str = 'Visit http://www.google.com bla bla <iframe src="http://apple.com">
           </frame> Bellow you can see http://www.ibm.com bla bla';

   preg_match_all($p, $str, $m);
   var_dump( $m[3] );
?>

输出:

array(2) {
  [0]=>
  string(21) "http://www.google.com"
  [1]=>
  string(18) "http://www.ibm.com"
}


建议:

我认为最好使用以下正则表达式排除 &lt;&gt; 中包含的所有链接,而不是为 src="" 设置例外:

$p = '/((<)(?(2)[^>]*>)(?:.*?))*?((?:(?:http|https|ftp):\/\/|www\.).*?[,:%#&\/?=\w+\.-]+)/smi';

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 2011-06-12
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多