我在这里遇到了一个非常奇怪的 preg_replace 问题(据我所知,这不是我第一次看到这个)。我有一个带有无效结构元素的 XML(结束标记缺少斜杠,中断解析器):
<info>
<datetime>2013.04.12 12:04:02</datetime>
<info>
我想要做的是:($xml = preg_replace('/<info>.*<info>/iu', '', $xml)
因为我实际上并不需要那个元素),但它不会替换。
我如何使它工作?
尝试将s
修饰符添加到正则表达式规则。不会在新行停止匹配
它不会替换,因为没有匹配项:
<?php
$xml = '<info>
<datetime>2013.04.12 12:04:02</datetime>
<info>';
var_dump(preg_match('/<info>.*<info>/iu', $xml, $matches), $matches);
int(0)
array(0) {
}
让我们看看有什么问题。究竟是什么.
意思?
匹配除换行符以外的任何字符(默认情况下)
就是这样!你如何更改默认值?我们查看了可用的内部选项并发现:
s
为了PCRE_DOTALL
.... PCRE_DOTALL 表示:
s (PCRE_DOTALL)
如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。
我们可以在本地更改它:
'/<info>(?s:.*)<info>/iu'
^
...或全球:
'/<info>.*<info>/ius'
^
添加s
修饰符并使用?
使其非贪婪:
$string = '<info>
<datetime>2013.04.12 12:04:02</datetime>
<info>
<valid>2013.04.12 12:04:02</valid>
<info>
<datetime>2013.04.12 12:04:02</datetime>
<info>';
var_dump(preg_replace('/<info>.*?<info>/s', '', $string));
见http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
您需要在正则表达式的末尾使用 s 修饰符。
$xml = preg_replace('/<info>.*<info>/ius', '', $xml);