代码之家  ›  专栏  ›  技术社区  ›  Ali

字符串分析帮助

  •  4
  • Ali  · 技术社区  · 15 年前

    我有一根如下的绳子:

    $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...
    */
    

    有什么想法吗?

    另外,它应该不区分大小写, <paragraph>, <PARAGRAPH>, <Paragraph> 都应该以同样的方式对待。

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

    7 回复  |  直到 15 年前
        1
  •  5
  •   Mark Byers    15 年前

    如果这实际上是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 允许在文本中匹配新行。不在段落标记内的所有文本将被忽略。

        2
  •  2
  •   Kobi    15 年前

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

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

    忽略空标记:

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

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

        3
  •  0
  •   Brian Agnew    15 年前

    如果你是 真的? 正在分析XML,然后 PHP DOM 在这里有用。上面可能有一个简单的例子,但是如果您要解析XML,我将使用一个专用的XML API。

        4
  •  0
  •   zneak    15 年前

    这看起来像XML。如果确实是这样,您应该使用simplexmlement或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
    }
    
        5
  •  0
  •   Mike Cialowicz    15 年前

    嗯,您应该使用XML解析器,比如 SimpleXML XMLReader .

    但是,如果你想破解一些东西,下面的方法会有效:

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

    只要每行有一个项目,这就可以工作。如果您将所有内容都放在一行上,请将上面的第二行代码替换为:

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

    祝你好运!

        6
  •  0
  •   intuited    15 年前

    因此,假设段落中有一些东西将破坏XML格式,或者您只是想了解更多关于regexp解析的内容,那么这应该可以完成您发布的示例的工作。它并不是特别健壮,但这就是人们喜欢使用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函数调用中,使用零宽度的lookaround断言查找每个段落的开头和结尾,然后调用preg-replace从每个块的开头和结尾裁剪标签。你最终得到的是 $paragraphs 存在

    array (
      0 => 'apples are red...',
      1 => 'john is a boy..',
      2 => 'this is dummy text......',
    )
    
        7
  •  0
  •   Mike Cialowicz    15 年前

    编辑后(不区分大小写,标记太大,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));
    }