PHP -> preg_match_all для следующей структуры <h6> мой заголовок </h6> некоторый текст ... <h6> другой заголовок </h6> больше текста - PullRequest
0 голосов
/ 03 декабря 2010

Я отчаянно ищу решение, чтобы получить эту текстовую строку

<h6>First pane</h6>
... pane content ...
<h6>Second pane</h6>
Hi, this is a comment.
To delete a comment, just log in and view the post's comments.
There you will have the option to edit
or delete them.
<h6>Last pane</h6>
... last pane content ...

, разобранную в массив PHP.

Мне нужно разделить ее на

1.
1.0=> First pane
1.1=> ... pane content ... 

2.
2.0=> Second pane
2.1=> Hi, this is a comment.
    To delete a comment, just log in and view the post's comments.
    There you will have the option to edit
    or delete them.

3.
3.0=> Last pane
3.1=> ... last pane content ...

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

Вы не должны пытаться анализировать HTML с помощью регулярного выражения. Это обречено на то, чтобы причинить много боли и несчастья всем, кроме самого простого HTML, и мгновенно сломается, если что-то изменится в вашей структуре документа. Вместо этого используйте правильный анализатор HTML или DOM, например php's DOMDocument http://php.net/manual/en/class.domdocument.php

Например, вы можете использовать getElementsByTagName http://www.php.net/manual/en/domdocument.getelementsbytagname.php, чтобы получить все h6

1 голос
/ 03 декабря 2010

Ваше регулярное выражение должно выглядеть следующим образом:

/<h6>([^<]+)<\/h6>([^<]+)/im

Если вы запустите следующий скрипт, вы увидите, что значения, которые вы ищете, находятся в $ match [1] и $ match [2].

$s = "<h6>First pane</h6>
... pane content ...
<h6>Second pane</h6>
Hi, this is a comment.
To delete a comment, just log in and view the post's comments.
There you will have the option to edit
or delete them.
<h6>Last pane</h6>
... last pane content ..";
$r = "/<h6>([^<]+)<\/h6>([^<]+)/im";

$matches = array();
preg_match_all($r,$s,$matches);

print_r($matches);
0 голосов
/ 03 декабря 2010

Я считаю, что вы ищете флаг PREG_SET_ORDER.

$regex = '~<h6>([^<]+)</h6>\s*([^<]+)~i';

preg_match_all($regex, $source, $matches, PREG_SET_ORDER);

Таким образом, каждый элемент в массиве $ match представляет собой массив, содержащий общее совпадение, за которым следуют все захваты группы дляодиночная попытка матча.Результат до первого матча выглядит следующим образом:

Array
(
    [0] => Array
        (
            [0] => First pane
... pane content ...

            [1] => First pane
            [2] => ... pane content ...

        )

увидеть его в действии на идеоне

РЕДАКТИРОВАТЬ: Обратите внимание на \s* Я тоже добавил.Без этого сопоставляемое содержимое всегда начинается без разделителя строк.

...