Php 在html正则表达式中查找和替换失败

Php 在html正则表达式中查找和替换失败,php,html,regex,Php,Html,Regex,我有一个正则表达式,它在html内容中查找一些过去可以使用的关键字,但现在失败了,我不明白为什么。(正则表达式来自。) 请注意:这不是试图为正则表达式提供修复。这里只是想说明创建一个能够成功解析HTML的正则表达式是多么困难(我敢说是不可能的)。即使结构良好的XHTML也会非常困难,但结构不良的HTML是正则表达式的禁区 我100%同意使用正则表达式尝试HTML解析是一个非常糟糕的想法。下面的代码使用提供的函数来解析一些简单的HTML标记。它在第二次尝试时发现嵌套的HTML标记Test: $t[

我有一个正则表达式,它在html内容中查找一些过去可以使用的关键字,但现在失败了,我不明白为什么。(正则表达式来自。)

请注意:这不是试图为正则表达式提供修复。这里只是想说明创建一个能够成功解析HTML的正则表达式是多么困难(我敢说是不可能的)。即使结构良好的XHTML也会非常困难,但结构不良的HTML是正则表达式的禁区

我100%同意使用正则表达式尝试HTML解析是一个非常糟糕的想法。下面的代码使用提供的函数来解析一些简单的HTML标记。它在第二次尝试时发现嵌套的HTML标记
Test

$t['label']='Test';
$text='Test

'; $find='/(?![^)(“测试”); $text='Test

'; $find='/(?![^)(?)(?Test\)\b/s 引用:\Test\ 结果: */ 函数replaceCallback($match){ if(是_数组($match)){ $htmlVersion=$match[1]; $urlVersion=urlencode($htmlVersion); 返回“”; } 返回$match; }
HTML不是正则语言,因此正则表达式可能不是这里最好的工具。您不应该使用正则表达式来解析HTML。请参见:好的,我想我明白了,HTML对于正则表达式来说不够正则:)但是,你如何在html内容中用超链接替换单词?@pixeline::-)很抱歉打断你的话-这只是一个到处都会出现的问题。正则表达式一开始似乎是个好主意,但很少奏效。无论如何,你应该在PHP中尝试。教程可能也会有帮助。@pixeline像你这样的问题每天至少出现三次。在HTML或类似关键字中搜索替换属性,或者只需浏览几页就可以了。您需要的密钥库是DOM。它很完美,除了如果找到的关键字已经在a标记中,它会在a标记中创建a标记……我越是尝试,我越认为该函数真正有效对于html片段来说,这是一个很好的例子。DOM在处理关键字方面非常糟糕。
$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s';
$text = preg_replace_callback($find, 'replaceCallback', $text);

function replaceCallback($match) {
        if (is_array($match)) {
            $htmlVersion = $match[1];
            $urlVersion = urlencode($htmlVersion);
            return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>';
        }
        return $match;
    }
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier 't' in /frontend.functions.php  on line 43
$t['label'] = 'Test';
$text = '<p>Test</p>';

$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s';
$text = preg_replace_callback($find, 'replaceCallback', $text);

echo "Find:   $find\n";
echo 'Quote:  ' . preg_quote($t['label']) . "\n";
echo "Result: $text\n";

/* Returns:

Find:   /(?![^<]+>)(?<!\w)(Test)\b/s
Quote:  Test
Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p>

*/

$t['label'] = '<em>Test</em>';
$text = '<p>Test</p>';

$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s';
$text = preg_replace_callback($find, 'replaceCallback', $text);

echo "Find:   $find\n";
echo 'Quote:  ' . preg_quote($t['label']) . "\n";
echo "Result: $text\n";

/* Returns:

Find:   /(?![^<]+>)(?<!\w)(Test)\b/s
Quote:  Test
Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p>
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier '\' in /test.php  on line 25
Find:   /(?![^<]+>)(?<!\w)(\<em\>Test\</em\>)\b/s
Quote:  \<em\>Test\</em\>

Result: 

*/

function replaceCallback($match) {
    if (is_array($match)) {
        $htmlVersion = $match[1];
        $urlVersion = urlencode($htmlVersion);
        return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>';
    }
    return $match;
}