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