Php 如何搜索不在任何html标记中的URL,然后将它们转换为超链接?

Php 如何搜索不在任何html标记中的URL,然后将它们转换为超链接?,php,regex,url,Php,Regex,Url,所以我的问题是,在相同的内容中有iframe、image标记等等。它们都有正则表达式匹配项,可以将它们转换为正确的格式 最后剩下的是正常的URL。我需要一个正则表达式,它将找到所有链接,这些链接只是链接,而不是在iframe、img或任何其他标记中。本例中使用的标记是常规HTML标记,而不是BB 目前,我将此代码作为内容呈现的最后一步。但它也会对上面所做的所有其他事情(iFrame和img渲染)做出反应,所以它也会去交换URL $output = preg_replace(array(

所以我的问题是,在相同的内容中有iframe、image标记等等。它们都有正则表达式匹配项,可以将它们转换为正确的格式

最后剩下的是正常的URL。我需要一个正则表达式,它将找到所有链接,这些链接只是链接,而不是在iframe、img或任何其他标记中。本例中使用的标记是常规HTML标记,而不是BB

目前,我将此代码作为内容呈现的最后一步。但它也会对上面所做的所有其他事情(iFrame和img渲染)做出反应,所以它也会去交换URL

$output = preg_replace(array(
    '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s'
), array(
    'test'
), $output);
$output=preg\u replace(数组(
“%\b([\w-]+:/?| www[.])[^\s()]+(?:\([\w\d]+\)|([^[:punct:][\s]|/))%s”
),数组(
“测试”
)(单位:百万元),;
我的内容如下所示:

# 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
#不要碰这些
#只有这些人转变了信仰
http://google.com
http://www.google.com
https://www2.google.com
www.google.com
正如您所看到的,在链接的末尾可能还有一些东西。在一整天尝试正则表达式工作之后,最后的

对我来说是一场噩梦。

Description 此解决方案将匹配不在标记属性值内的URL,并将它们替换为新的内容

正则表达式既匹配跳过的内容,也匹配替换的内容。然后preg_match_回调函数执行一个内部函数,该函数测试捕获组1是否已填充(这是所需的文本),如果已填充,则返回更改,否则只返回不需要的文本

我使用了您的url匹配正则表达式,并做了一些小的修改,例如将未使用的捕获组
转换为非捕获组
(?:
)。这使得正则表达式引擎运行得更快,并且更容易修改表达式

原始表达式:
]*)*>(((?:[\w-]+:\/\/?)[^\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;

我不认为正则表达式是解决你问题的方法……惊人的答案。但是现在给了我一个解析错误:语法错误,意外的T_函数。对我来说,由于回调(我使用的是5.2.17版本),它给了我一个错误。而且,如果我只是在自己的代码中使用regex部分,它也会从iframe中删除所有内容。这是正确的,regex将匹配您想要跳过的内容,并匹配您想要替换的内容。将要替换的内容放入捕获组1。然后在函数内部检查捕获组1是否已填充。如果你在没有函数的情况下放置正则表达式,那么你将替换所有内容。preg_replace_回调是在5.3.0中添加到PHP的,现在已经是生命的终结,最新版本是5.5.1Ok,所以基本上,使用回调是唯一的方法。因为这显然不起作用。。我在另一台服务器上进行了测试,结果成功了。所以基本上,问题是局部的。我现在将与ISP进行友好的交谈。谢谢你,伙计!:)
# 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>