Индексированная замена внутри строки - PullRequest
2 голосов
/ 22 мая 2011

Я хочу преобразовать строку со специальным тегом HTML и соответствующим образом проанализировать ее.Ниже я покажу, за какой исходной строкой следует строка, которую я хочу проанализировать.Если кто-то может направить меня к правильному методу кодирования, чтобы сделать это возможным, это было бы фантастически.

Исходная строка:

$string = '<string 1="Jacob" 2="ice cream">{1} likes to have a lot of {2}.</string>';

Разобранная строка:

$parsed_string = 'Jacob likes to have a lot of ice cream.';]

РЕДАКТИРОВАТЬ:

Я забыл добавить, что переменная $ string может иметь несколько строк с несколькими параметрами, например, переменная $ string может быть следующей:

$string = '<string 1="hot dog">I like to have {1}</string> on <string 1="beach" 2="sun">the {1} with the blazing hot {2} staring down at me.';

Мне нужно решение, которое можетпроанализируйте приведенный выше пример кода.

РЕДАКТИРОВАТЬ 2:

Вот пример кода, который я разработал, который неполон и содержит несколько ошибок.Если существует более одной опции ex 1 = 'blah' 2 = 'blahblah', она не будет анализировать второй вариант.

<code>$string = '<phrase 1="Jacob" 2="cool">{1} is {2}</phrase> when <phrase 1="John" 2="Chris">{1} and {2} are around.</phrase>';

preg_match_all('/<phrase ([0-9])="(.*?)">(.*?)<\/phrase>/', $string, $matches);

    print $matches[1][0] . '<br />';
    print $matches[2][0] . '<br />';
    print $matches[3][0] . '<br />';

    print '<hr />';

    $string = $matches[3][0];

    print str_replace('{' . $matches[1][0] . '}', $matches[2][0], $output);

    print '<hr />';

    print '<pre>';
    print_r($matches);
    print '
';

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Поскольку $string не является допустимым XML (например, содержит числа в качестве имен атрибутов), вы можете попробовать:

$string = '<string 1="Jacob" 2="ice cream">{1} likes to have a lot of {2}.</string>';
$parsed_string = strip_tags($string);
for ($i = 1; $i <= 2; $i++) {
    if (preg_match('/' . $i . '="([^"]+)"/', $string, $match))
        $parsed_string = str_replace('{' . $i .'}', $match[1], $parsed_string);
}
echo $parsed_string;

ОБНОВЛЕНИЕ

Ваша РЕДАКТИРОВКА переключена сналичие одного тега <string> для наличия нескольких переменных <string> в переменной.Этот должен работать для кратных:

$string2 = '<string 1="hot dog">I like to have {1}</string> on <string 1="beach" 2="sun">the {1} with the blazing hot {2} staring down at me.</string>';
$parsed_string2 = '';
$a = explode('</string>', $string2);
foreach ($a as $s) {
    $parsed_elm = strip_tags($s);
    for ($i = 1; $i <= 2; $i++) {
        if (preg_match('/' . $i . '="([^"]+)"/', $s, $match))
            $parsed_elm = str_replace('{' . $i .'}', $match[1], $parsed_elm);
    }
    $parsed_string2 .= $parsed_elm;
}
echo $parsed_string2;
0 голосов
/ 22 мая 2011
<?php
    $rows = array();
    $xml = "
        <string 1="Jacob" 2="ice cream">{1} likes to have a lot of {2}.</string>        
        <string 1="John" 2="cream">{1} likes to have a lot of {2}.</string>     
    "
    $parser = xml_parser_create();
    xml_parse_into_struct($parser, trim($xml), $xml_values);        
    foreach ($xml_values as $row){
        $finalRow = $row['values'];
        foreach ($row['attributes'] as $att => $attval){
            $finalRow = str_replace ($finalRow, "{".$att."}", $attval);
        }
        $rows[] = $finalRow;
    }
?>

Вот версия, которая не использует регулярные выражения, это выглядело более простым. Я не знаю, как парсер xml справился бы с атрибутами, которые начинаются с цифры.

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