Php 我需要什么正则表达式模式?

Php 我需要什么正则表达式模式?,php,regex,Php,Regex,我需要一个正则表达式在PHP工作,以取代美国英语单词在HTML与英国英语单词。因此,颜色将被颜色、米和米等所取代[我知道米也是一个英式英语单词,但对于副本,我们将始终使用它来表示距离单位,而不是测量设备]。该模式需要在以下稍微做作的示例中准确工作,尽管由于我无法控制实际输入,这些可能存在: <span style="color:red">This is the color red</span> [不应替换HTML标记中的颜色,但应替换句子中的颜色] <p>C

我需要一个正则表达式在PHP工作,以取代美国英语单词在HTML与英国英语单词。因此,颜色将被颜色、米和米等所取代[我知道米也是一个英式英语单词,但对于副本,我们将始终使用它来表示距离单位,而不是测量设备]。该模式需要在以下稍微做作的示例中准确工作,尽管由于我无法控制实际输入,这些可能存在:

<span style="color:red">This is the color red</span>
[不应替换HTML标记中的颜色,但应替换句子中的颜色]

<p>Color: red</p>
[应替换单词]

<p>Tony Brammeter lives 2000 meters from his sister</p>
[应替换单词中的米,而不是名称中的米]


我知道有些情况下,如果他的名字是托尼·米特(Tony Meter)的话,更换他是没有用的,但这些情况非常罕见,我们可以在出现时处理

不需要显式使用正则表达式。您可以尝试该函数,或者如果需要它不区分大小写,请使用该函数

例如:

$str = "<p>Color: red</p>";
$new_str = str_ireplace ('%color%', 'colour', $str);

您可以传递一个包含所有要搜索的单词的数组,而不是字符串。

我认为您更需要一本词典,甚至可能需要一些语法分析,以便正确执行此操作,因为您无法控制输入。一个纯粹的正则表达式解决方案并不能真正正确地处理此类数据


所以我建议首先列出一个需要替换的单词列表,这些单词不仅仅是颜色和韵律

您不需要此函数的正则表达式。正则表达式本质上是无状态的,您需要某种状态度量来区分“在html标记中”和“在数据中”


您希望将HTML解析器与类似语法词典的工具结合使用,或者更好地使用Lucero建议的适当语法词典等工具。

第二个问题更简单-当单词周围有单词边界时,您希望替换:-这将确保您不会替换Brammeter中的米


第一个问题要困难得多。您不希望替换HTML实体中的单词-字符之间没有任何内容。因此,您的匹配必须确保您上次看到>或什么都没有,但决不能仅仅是Html/xml不应该用正则表达式处理,要生成一个匹配的Html/xml确实很难。但您可以使用内置函数递归处理字符串:

# Warning: untested code!
function process($node, $replaceRules) {
    foreach ($node->children as $childNode) {
        if ($childNode instanceof DOMTextNode) {
            $text = pre_replace(
                array_keys(replaceRules),
                array_values($replaceRules),
                $childNode->wholeText
            );
            $node->replaceChild($childNode, new DOMTextNode($text));
        } else {
            process($childNode, $replaceRules);
        }
    }
}
$replaceRules = array(
    '/\bcolor\b/i' => 'colour',
    '/\bmeter\b/i' => 'metre',
);
$doc = new DOMDocument();
$doc->loadHtml($htmlString);
process($doc, $replaceRules);
$htmlString = $doc->saveHTML();

除了我相当肯定他的例子中有1个和3个会失败;后者需要在基于PCRE的正则表达式中进行单词边界检查\bword\b,而前者至少需要一些基本的标记检查.Cool。这似乎很有效。我必须对代码进行一些更改才能使其工作DOMTextNode对我不起作用,而DOMText对我起作用;在$node->replaceChild等中交换参数,但到目前为止,它似乎工作得很好。唯一的小问题是我想对字符串执行此操作,使用新的DOMDocument将字符串转换为一个HTML页面,其中doctype和f用HTML和body标记包装。我可以使用标准str_replace等删除此项,但有没有更好的方法一开始就不创建这些项?