2013-08-22 32 views
0

我有一个像这样的字符串:正则表达式劈裂字符串数组

== Paragraph == 
=== title 1 === 
content 

=== Title 2 === 
other content 

== Paragraph 2 == 
=== asd1 === 
dfdsfdsfdsfdsfdsfsdfdsf 

=== asd2 === 
fgdfgfdgfdgfdgfdgfdgfdg 

我试图把它解析成数组是这样的:

$arr = array( 
    array("title"=>"Paragraph", "content" => "=== title 1 === 
content 

=== Title 2 === 
other content "), 
array("title"=>"Paragraph 2", "content" => "=== asd1 === 
dfdsfdsfdsfdsfdsfsdfdsf 

=== asd2 === 
fgdfgfdgfdgfdgfdgfdgfdg")); 

我已经试过这expession为越来越段落名称:

preg_match_all("@== (.*?) ==.*[email protected]", $data, $paragraphs); 

但这expresion不工作,因为我想,因为它不整款搭配输出是这样的,它没有得到内容:

Array 
    (
     [0] => Paragraph 
     [1] => title 1 
     [2] => Title 2 
     [3] => Paragraph 2 
     [4] => asd1 
     [5] => asd2 
    ) 

我也曾尝试(nl2br因为我不知道如何使用正则表达式中的新行)

$data = nl2br($data); 
preg_match_all("@== (.*?) ==<br />.*[email protected]", $data, $paragraphs); 

但结果是这样的:

[0] => Array 
    (
     [0] => == Paragraph == <br /> 
=== title 1 ===<br /> 
content<br /> 
<br /> 
=== Title 2 ===<br /> 
other content <br /> 
<br /> 
== Paragraph 2 ==<br /> 
    ) 

我不理解的常规expresions好,我不知道如何解决我的问题。

+2

这似乎很像降价,也许看看减价解析器? – Maerlyn

回答

1

你也许可以试试这个正则表达式?

@(==[^=]+==)(.+?(?=[^=]==[^=]|$))@s 

Demo on regex101

+0

谢谢。这正是我需要:) – Deepsy

+1

真棒然后@Deepsy! ^^ – Jerry

0

如何:

$str = '== Paragraph == 
=== title 1 === 
content 

=== Title 2 === 
other content 

== Paragraph 2 == 
=== asd1 === 
dfdsfdsfdsfdsfdsfsdfdsf 

=== asd2 === 
fgdfgfdgfdgfdgfdgfdgfdg'; 
$list = preg_split('/(?<!=)== (.+?) ==(?!=)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE); 
print_r($list); 

输出:

Array 
(
    [0] => 
    [1] => Paragraph 
    [2] => 
=== title 1 === 
content 

=== Title 2 === 
other content 


    [3] => Paragraph 2 
    [4] => 
=== asd1 === 
dfdsfdsfdsfdsfdsfsdfdsf 

=== asd2 === 
fgdfgfdgfdgfdgfdgfdgfdg 
) 
0

这里,我们打破每个元素融入到自己的一块用preg_match_alllook around assertions in RegEx数组。

<?php 

    $pattern = "~((?<!=)(?<=={2})\s*((?<=\s)[^=]+(?=\s))\s*(?=={2})(?!=)|(?<====)\s*((?<=\s)[^=]+(?=\s))\s*(?====)|(?<==\s)\s*((?<=\s)[^=]+)\s*(?!=))~"; 

    $string="== Paragraph == 
    === title 1 === 
    content 

    === Title 2 === 
    other content 

    == Paragraph 2 == 
    === asd1 === 
    dfdsfdsfdsfdsfdsfsdfdsf 

    === asd2 === 
    fgdfgfdgfdgfdgfdgfdgfdg"; 

    preg_match_all($pattern,$string,$matches); 


    print_r($matches[0]); 


?> 

输出

Array 
(
    [0] => Paragraph 
    [1] => title 1 
    [2] => 
content 


    [3] => Title 2 
    [4] => other content 

    [5] => Paragraph 2 
    [6] => asd1 
    [7] => 
dfdsfdsfdsfdsfdsfsdfdsf 


    [8] => asd2 
    [9] => fgdfgfdgfdgfdgfdgfdgfdg 
)