Помощь при разборе строк - PullRequest
4 голосов
/ 26 марта 2010

У меня есть строка, подобная следующей:

$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 и т. Д. Мне нужно регулярное выражение, которое проанализирует это.

Ответы [ 7 ]

5 голосов
/ 26 марта 2010

Если это действительно 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 голосов
/ 26 марта 2010

Если это простая структура без вложенности:

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

Чтобы игнорировать пустые токены:

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

Источник: http://php.net/manual/en/function.preg-split.php

0 голосов
/ 26 марта 2010

После ваших изменений (без учета регистра и слишком больших тегов для 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));
}
0 голосов
/ 26 марта 2010

Если предположить, что у вас есть параграф в параграфах, который нарушает формат 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......',
)
0 голосов
/ 26 марта 2010

Ну, вам следует использовать синтаксический анализатор XML, например SimpleXML или XMLReader .

Однако, если вы хотите что-то взломать, сработает следующее:

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

Это будет работать до тех пор, пока у вас есть один элемент в строке. Если у вас все в одной строке, замените вторую строку кода выше:

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

Удачи!

0 голосов
/ 26 марта 2010

Это яростно выглядит как XML. Если это действительно так, вам следует использовать SimpleXMLElement или любое другое средство синтаксического анализа XML в PHP.

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

foreach($xml->paragraph as $paragraph)
{
    // do stuff to $paragraph; it's strval is the contents of the paragraph
}
0 голосов
/ 26 марта 2010

Если вы действительно анализируете XML, тогда PHP DOM здесь пригодится. У вас может быть простой пример, приведенный выше, но если вы анализируете XML, я бы использовал выделенный XML API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...