我正在寻找一种方法,将整个页面中看起来相似的所有字符串替换为它们定义的值
请不要向我推荐其他包含语言常量的方法。
像这样的字符串:
[_HOME]
[_NEWS]
它们在 [_*] 部分中看起来都一样
现在最大的问题是如何扫描HTML页面并替换定义的值。
解析 html 页面的一种方法是使用 DOMDocument,然后pre_replace() 它
但我的主要问题是为替换编写模式
$pattern = "/[_i]/";
$replacement= custom_lang("/i/");
$doc = new DOMDocument();
$htmlPage = $doc->loadHTML($html);
preg_replace($pattern, $replacement, $htmlPage);
在正则表达式中,[]
是运算符,所以如果你使用它们,你需要转义它们。
表达式的其他问题是_*
哪个将匹配零或多个_
。您需要将其替换为一些有意义的匹配,Like,_.*
它将匹配_和之后的任何其他字符。所以你的完整表达变成了,
/'[_.*?']/
嘿,为什么?
,你可能会想问:原因是它执行非贪婪的匹配。喜欢
[_foo] [_bar]
查询字符串,那么贪婪匹配应返回一个匹配项并为您提供整个匹配项,因为您的表达式对该字符串完全有效,但非贪婪匹配将使您获得两个单独的匹配项。 (更多信息)
通过有一个_
后跟大写字母,你可能会更好地限制。喜欢
/'[_[A-Z]+']/
更新:使用匹配的字符串并替换它们。为此,我们使用称为反向引用的概念。
考虑修改上面的表达式,将字符串括在括号中,例如/'[_([A-Z]+)']/
现在,在preg-replace
参数中,我们可以通过用 $1
反向引用它们来使用括号中的表达式。所以你可以使用的是,
preg_replce("/'[_([A-Z]+)']/e", "my_wonderful_replacer('$1')", $html);
注意:我们需要e modifier
将第二个参数视为 PHP 代码。(更多信息)
如果您
知道要替换的完整关键字(例如 [_HOME]
),那么您可以使用 str_replace() 替换所有实例。
无需通过引入正则表达式使这样的事情变得更加复杂。