Регулярное выражение для извлечения текста между двумя тегами и ТАКЖЕ имя тега - PullRequest
0 голосов
/ 09 июля 2010

Мне нужен простой язык разметки для хранения разных частей строки в поле TEXT, а затем для извлечения этих частей. В общем, я хочу какой-то простой XML. Хранить их в поле таблицы легко, но извлечь их ... это другой вопрос. Мне удалось сделать это, используя простое регулярное выражение для обычного HTML:

|<[^>]+>(.*)</[^>]+>|U

Но для того, чтобы заново составить исходный массив (и использовать разметку более широко), мне также необходимо знать имена тегов. И это регулярное выражение не делает этого.

Примеры:

Введите текст:

<user_input>Hello! my name is Williams</user_input>

Функция preg_match_all () с использованием приведенного выше регулярного выражения возвращает:

array
  0 => 
    array
      0 => string '<user_input>Hello! my name is Williams</user_input>' (length=34)

  1 => 
    array
      0 => string 'Hello! my name is Williams' (length=34)

Мне нужно, чтобы он возвращал имя тега "user_input". Да, я знаю, я сосу на регулярное выражение. Да, я знаю "использовать синтаксический анализатор XML", но это слишком много для того, что я делаю.

Ответы [ 4 ]

6 голосов
/ 09 июля 2010

Как анализатор xml "слишком большой"? PHP имеет встроенные встроенные функции, которые позволяют вам сделать это легко.

Regex не подходит для работы.

<?php

$string = '
<root>
<input_name>blah</input_name>
</root>
';

$x = new DOMDocument();
$x->loadXML($string);
$root = $x->documentElement;
$elements = $root->getElementsByTagName('*');
$count = count($elements->length);

for ( $i = 0; $i< $count; $i++ ) {
    $el = $elements->item($i);
    echo $el->nodeName . '<br>';
    echo $el->nodeValue . '<br>';
}
1 голос
/ 09 июля 2010

Так что в основном я хочу какой-то простой XML

Тогда вам нужен парсер XML. И, эй, у PHP есть расширение для разбора XML, которое вы можете установить.

Серьезно, попытка взломать свой путь с помощью регулярных выражений только закончится болью и разочарованием. Используйте синтаксический анализатор XML и сэкономьте часы работы.

но это слишком много для того, что я делаю.

Нет, это не так. Вы хотите что-то проанализировать - следовательно, вы должны использовать парсер.

0 голосов
/ 09 июля 2010

Просто используйте группу захвата, как вы сделали с контентом:

|<([^>]+)>([^<]*)</\1>|

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

0 голосов
/ 09 июля 2010
|<([^>]+)>(.*)</[^>]+>|U

Будет делать то, что вы хотите.Я просто добавил две скобки.Это очень хрупкий взлом.Вы хотите использовать парсер.Тем более, что вы, очевидно, не понимаете регулярные выражения.

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