正则表达式匹配除特定字符串之外的任何字符

时间:2011-09-27 15:06:37

标签: php xml regex

我正在使用正则表达式,

/(\<\s*?string(-array)?\s*?.*?\s*?\>\s*?)(.*)(\s*?\<\/string(-array)?\>)/ 

...匹配表单之间的所有内容或标签:

<string-array name="saveArray">
  <item>Téléphone</item>
  <item>Carte mémoires</item>
</string-array>

问题是,我只能匹配'string'标签或包含一个项目的数组的内容。当我用[^ s]替换中间捕获组中的点时,我得到了我想要的内容,但是这个解决方案将无法匹配任何包含's'的内容。我在内容('item-matching')组之前的'str'尝试了一个负面的后视,它给了我相同的结果。

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:2)

您需要使用SimpleXML来解析XML。在边缘情况下,XML可能会更改或不匹配您的正则表达式 - 因此最好只使用XML解析器。

<?php
$xml '<string-array name="saveArray">'
. '<item>Téléphone</item>'
. '<item>Carte mémoires</item>'
. '</string-array>';

$items = new SimpleXMLElement($xml);

答案 1 :(得分:1)

正如其他人所说的那样使用正则表达式来解析xml / html。

无论如何,这应该有效:

if ($subject =~ m!<(string-array)[^>]*>(.*?)</\1>!si) {
    print $2, "\n";
}

答案 2 :(得分:0)

真的 不应该使用regexps解析xml。

那就是说,我认为弄乱你的事情可能是“.”(在许多正则表达式引擎中,使用默认标志)匹配任何字符除了换行符..所以您的.*不会匹配多行。尝试将“.*”替换为“[\w\W]*”,或添加一个表示“.”应与所有字符匹配的正则表达式标记。