字符串解析帮助

时间:2010-03-25 21:07:37

标签: php regex string

我有一个如下字符串:

$string = "
<paragraph>apples are red...</paragraph>
<paragraph>john is a boy..</paragraph>
<paragraph>this is dummy text......</paragraph>
";

我想将此字符串拆分为一个数组,该数组包含<paragraph></paragraph>标记之间的文本。例如:

$string = "
<paragraph>apples are red...</paragraph>
<paragraph>john is a boy..</paragraph>
<paragraph>this is dummy text......</paragraph>
";

$paragraphs = splitParagraphs($string);
/* $paragraphs now contains:
   $paragraphs[0] = apples are red...
   $paragraphs[1] = john is a boy...
   $paragraphs[1] = this is dummy text...
*/

有什么想法吗?

P.S它应该不区分大小写,<paragraph>, <PARAGRAPH>, <Paragraph>应该以同样的方式处理。

编辑:这不是XML,这里有很多东西会打破XML的结构,因此我不能使用SimpleXML等。我需要一个正则表达式来解析它。< / p>

7 个答案:

答案 0 :(得分:5)

如果这实际上是XML,那么我同意其他答案。但是如果它不是有效的XML,而只是看起来像XML的模糊,那么你应该尝试用XML解析器解析它。相反,您可以使用正则表达式:

$matches = array();
preg_match_all(":<paragraph>(.*?)</paragraph>:is", $string, $matches);
$result = $matches[1];
print_r($result);

输出:

Array
(
    [0] => apples are red...
    [1] => john is a boy..
    [2] => this is dummy text......
)

请注意,i表示不区分大小写,s允许新行在文本中匹配。不在段落标记内的所有文本都将被忽略。

答案 1 :(得分:2)

如果这是一个简单的结构,没有嵌套:

preg_split("#</?paragraph>#i", $string);

忽略空标记:

preg_split("#</?paragraph>#i", $string, -1, PREG_SPLIT_NO_EMPTY);

来源:http://php.net/manual/en/function.preg-split.php

答案 2 :(得分:0)

如果你真的解析XML,那么PHP DOM在这里有用。您可能上面有一个简单的示例,但如果您正在解析XML,我将使用专用的XML API。

答案 3 :(得分:0)

这看起来很像XML。如果确实如此,则应使用SimpleXMLElement或PHP的任何其他XML分区工具。

$xml = new SimpleXMLElement('<root>' . $paragraphs . '</root>');

foreach($xml->paragraph as $paragraph)
{
    // do stuff to $paragraph; it's strval is the contents of the paragraph
}

答案 4 :(得分:0)

好吧,您应该使用XML解析器,例如SimpleXMLXMLReader

但是,如果您想破解某些内容,以下内容将起作用:

$string = str_replace("<paragraph>", "", $string);
$string = str_replace("</paragraph>", "", $string);
$paragraphs = explode("\n", $string);

只要每行有一个项目,这将有效。如果您在一行上拥有所有内容,请使用以下代码替换上面的第二行代码:

$string = str_replace("</paragraph>", "\n", $string);
祝你好运!

答案 5 :(得分:0)

因此,假设您在段落中有一些内容会破坏XML格式,或者您只是想了解更多有关正则表达式解析的知识,那么这应该可以为您的示例完成工作发布。它不是特别健壮,但这就是人们喜欢使用XML的原因,因为它有一个正式的语法,可以很容易地解析。或者更容易,无论如何。特别是这个解决方案取决于正在解析的字符串,以段落标记开头,以段落关闭标记结束,并且每个段落之间只有空格。因此,它是您的示例问题的一个非常直接的解决方案。但是,因为这是您自定义数据格式的唯一现有规范文档,所以我能做到最好:)

$string = " <paragraph>apples are red...</paragraph> <paragraph>john is a boy..</paragraph> <paragraph>this is dummy text......</paragraph> ";
$paragraphs = preg_replace('/(^\s*<paragraph>|<\/paragraph>\s*$)/', '', preg_split('/(?<=<\/paragraph>)\s*(?=<paragraph>)/', $string));

这里发生的是你在preg_split函数调用中使用零宽度查找断言来查找每个段落的开头和结尾,然后调用preg_replace来从开头和结尾裁剪出标签。每个块。您最终得到$paragraphs

的内容
array (
  0 => 'apples are red...',
  1 => 'john is a boy..',
  2 => 'this is dummy text......',
)

答案 6 :(得分:0)

编辑后(不区分大小写,标记太大,无法处理XML解析器),以下内容应该有效:

$paragraphs = array();
$exploded = explode("</", $string);
unset($exploded[count($exploded) - 1]); //remove the useless, final "paragraph>" item
$exploded[0] = str_replace("<paragraph>", "", $exploded[0]); // first item is a special case
foreach($exploded as $item)
{
    array_push($paragraphs, str_replace("paragraph>\n<paragraph>", "", $item));
}