我有一个如下字符串:
$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>
答案 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);
答案 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解析器,例如SimpleXML或XMLReader。
但是,如果您想破解某些内容,以下内容将起作用:
$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));
}