所以我的问题是,在相同的内容中有iframe,图片标签等。它们都有正则表达式匹配,可以将它们转换为正确的格式。
剩下的最后一件事是普通网址。我需要一个正则表达式,它会找到所有简单链接的链接,而不是iframe,img或任何其他标记。在这种情况下使用的标签是常规HTML标签,而不是BB。
目前我将此代码作为内容呈现的最后一次传递。但它也会对上面做的所有其他事情做出反应(iframe和img效果图。)所以它会将网址交换到那里。
$output = preg_replace(array(
'%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s'
), array(
'test'
), $output);
我的内容看起来像这样:
# dont want these to be touched
<iframe width="640" height="360" src="http://somedomain.com/but-still-its-a-link-to-somewhere/" frameborder="0"></iframe>
<img src="http://someotherdomain.com/here-is-a-img-url.jpg" border="0" />
# and only these converted
http://google.com
http://www.google.com
https://www2.google.com<br />
www.google.com
正如您所看到的,链接的末尾也可能存在某些内容。经过一整天尝试正则表达式工作后,最后<br />
对我来说是一场噩梦。
答案 0 :(得分:2)
此解决方案将匹配不在标记属性值内的网址,并将用新内容替换它们。
正则表达式匹配您跳过的内容和您替换的内容。然后preg_match_callback执行一个内部函数,测试是否填充了捕获组1(这是所需的文本),如果是,则返回更改,否则它只返回不需要的文本。
我使用您的网址匹配正则表达式进行了一些小修改,例如将未使用的捕获组(
... )
转换为非捕获组(?:
... )
。这使得正则表达式引擎运行得更快,并且更容易修改表达式。
原始表达式:<(?:[^'">=]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>|((?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|(?:[^[:punct:]\s]|\/)))
<强>代码强>
<?php
$string = '# dont want these to be touched
<iframe width="640" height="360" src="http://somedomain.com/but-still-its-a-link-to-somewhere/" frameborder="0"></iframe>
<img src="http://someotherdomain.com/here-is-a-img-url.jpg" border="0" />
# and only these converted
http://google.com
http://www.google.com
https://www2.google.com<br />
www.google.com';
$regex = '/<(?:[^\'">=]*|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*>|((?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|(?:[^[:punct:]\s]|\/)))/ims';
$output = preg_replace_callback(
$regex,
function ($matches) {
if (array_key_exists (1, $matches)) {
return '<a href="' . $matches[1] . '">' . $matches[1] . '<\/a>';
}
return $matches[0];
},
$string
);
echo $output;
<强>输出强>
# dont want these to be touched
<iframe width="640" height="360" src="http://somedomain.com/but-still-its-a-link-to-somewhere/" frameborder="0"></iframe>
<img src="http://someotherdomain.com/here-is-a-img-url.jpg" border="0" />
# and only these converted
<a href="http://google.com">http://google.com<\/a>
<a href="http://www.google.com">http://www.google.com<\/a>
<a href="https://www2.google.com">https://www2.google.com<\/a><br />
<a href="www.google.com">www.google.com<\/a>