Я пытаюсь разобрать текст в HTML с помощью пользовательских вложенных тегов - PullRequest
1 голос
/ 12 июня 2011

Я бы хотел разобрать текст в массив:

Мой текст выглядит так:

You've come to the {right; correct; appropriate} place! Start by {searching; probing; inquiring} our site below, or {browse; {search; lookup; examine}} our list of popular support articles.

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

$tags[0][0] = 'right';
$tags[0][1] = 'suitable';
$tags[0][2] = 'appropriate';
$tags[1][0] = 'searching';
$tags[1][1] = 'probing';
$tags[1][2] = 'inquiring';
$tags[2][1] = 'browse';
$tags[2][2] = 'search';
$tags[2][3] = 'lookup';
$tags[2][4] = 'examine';

По существу игнорирование вложенности тегов. Любая помощь будет принята с благодарностью.

Мои единственные текущие идеи для этого - проходить текст за символом, пока я не найду {, которое увеличит переменную глубины. Захватывайте слова между ними, пока я не найду} уменьшающую переменную глубины, и когда она вернется к нулю, прекратите захват слов. Мне просто интересно, есть ли гораздо более простой способ сделать это. Спасибо.

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

$code = "You've come to {the right; the correct; the appropriate} place! 
    Start by {searching; probing; inquiring} our site below, or 
    {browse; {search; {foo; bar}; lookup}; examine} our list of 
    popular support articles.";
echo $code."\r\n\r\n";

preg_match_all('/{((?:[^{}]*|(?R))*)}/', $code, $matches);
$arr = array();
$r = array('{','}');

foreach($matches[1] as $k1 => $m)
{
    $ths = explode(';',str_replace($r,'',$m));
    foreach($ths as $key => $val)
    {
        if($val!='')
        $arr[$k1][$key] = trim($val);
        $code = str_replace($matches[0][$k1],'[[rep'.$k1.']]',$code);
    }
}    
echo $code;

Returns

Вы пришли {направо; правильный; соответствующее место! Начните с {поиска; зондирования; запрашивая} наш сайт ниже, или {просматривать; {поиск; {Foo; бар}; уважать}; изучить} наш список популярных статей поддержки.

Вы пришли в [[rep0]] место! Начните с [[rep1]] нашего сайта ниже или [[rep2]] нашего списка популярных статей поддержки.

1 Ответ

1 голос
/ 12 июня 2011

Мои единственные текущие идеи для этого - перебирать текст за символом, пока я не найду {, которое увеличит переменную глубины. Захватывайте слова между ними, пока я не найду} уменьшающую переменную глубины, и когда она вернется к нулю, прекратите захват слов. Мне просто интересно, есть ли гораздо более простой способ сделать это.

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

<?php

$text = "You've come to the {right; correct; appropriate} place! 
    Start by {searching; probing; inquiring} our site below, or 
    {browse; {search; {foo; bar}; lookup}; examine} our list of 
    popular support articles. {the right; the correct; the appropriate}";

preg_match_all('/{((?:[^{}]*|(?R))*)}/', $text, $matches);

$arr = array();

foreach($matches[1] as $m) {
  preg_match_all('/\w([\w\s]*\w)?/', $m, $words);
  $arr[] = $words[0];
}    

print_r($arr);

?>

даст:

Array
(
    [0] => Array
        (
            [0] => right
            [1] => correct
            [2] => appropriate
        )

    [1] => Array
        (
            [0] => searching
            [1] => probing
            [2] => inquiring
        )

    [2] => Array
        (
            [0] => browse
            [1] => search
            [2] => foo
            [3] => bar
            [4] => lookup
            [5] => examine
        )

    [3] => Array
        (
            [0] => the right
            [1] => the correct
            [2] => the appropriate
        )

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