PHP/find中的正则表达式&书信电报;a></a>&引用;

PHP/find中的正则表达式&书信电报;a></a>&引用;,php,html,regex,hyperlink,Php,Html,Regex,Hyperlink,我想查看一个文本区。如果用户在文本区域中输入一些链接,php应该自动标记这些链接。我正在使用以下代码: $message = "text with some link within"; $url = '@(?!<a[^>]*?>)(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])(?![^<]*?</a>)@'; if(preg_match($url,

我想查看一个文本区。如果用户在文本区域中输入一些链接,php应该自动标记这些链接。我正在使用以下代码:

    $message = "text with some link within"; 

    $url = '@(?!<a[^>]*?>)(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])(?![^<]*?</a>)@';


    if(preg_match($url, $message) == 1){

    $message = preg_replace($url, '<a href="http$2://$4" target="_blank" rel="nofollow" title="$0">$0</a>', $message);

    }

谢谢你的帮助

我对PHP不熟悉,也许这不是一个很好的url验证模式,但关键是如果已经有了“a”标记,文本不会被替换

<?php

    $message = array(
        'Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>',
        "Hello .... http://www.test.com ..."
    );

    $url = '@(<a[^>]*>[^<]+</a>|((https?://)?[\w\.-]+\.[a-zA-Z]{2,3}[^\s\W]*))@';

    foreach ($message as $msg) {

        preg_match($url, $msg, $matches);

        if(preg_match($url, $msg) == 1 && count($matches) > 2) {

            $msg = preg_replace($url, '<a href="$0" target="_blank" rel="nofollow" title="$0">$0</a>', $msg);

        }

        echo $msg.PHP_EOL;

    }

    // Output:
    // Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>
    // Hello .... <a href="http://www.test.com" target="_blank" rel="nofollow" title="http://www.test.com">http://www.test.com</a> ...

在问题标题中,您希望常规体验在您的描述中找到您希望与URL-s匹配的内容。你需要哪一个?:)您希望在html代码或原始文本中进行搜索吗?不要使用正则表达式来解析html,请使用DOM解析器库,如
DOMDocument
。正如您在示例中所看到的,我正在寻找一种只标记链接而不标记链接的方法。。。最大的问题是,如果我再次编辑帖子,正则表达式会向上一个标签添加另一个标签,因此在最后链接根本不起作用
<?php

    $message = array(
        'Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>',
        "Hello .... http://www.test.com ..."
    );

    $url = '@(<a[^>]*>[^<]+</a>|((https?://)?[\w\.-]+\.[a-zA-Z]{2,3}[^\s\W]*))@';

    foreach ($message as $msg) {

        preg_match($url, $msg, $matches);

        if(preg_match($url, $msg) == 1 && count($matches) > 2) {

            $msg = preg_replace($url, '<a href="$0" target="_blank" rel="nofollow" title="$0">$0</a>', $msg);

        }

        echo $msg.PHP_EOL;

    }

    // Output:
    // Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>
    // Hello .... <a href="http://www.test.com" target="_blank" rel="nofollow" title="http://www.test.com">http://www.test.com</a> ...