我希望转换一个带有特殊HTML标记的字符串并相应地解析它。下面我将展示原始字符串后面跟我想要解析的字符串的内容。如果有人可以指导我采用正确的编码方法来实现这一点,那就太棒了。
原始字符串:
$string = '<string 1="Jacob" 2="ice cream">{1} likes to have a lot of {2}.</string>';
Parsed 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:
以下是我开发的示例代码,该代码不完整且有一些错误。如果有多个选项e.x. 1 ='blah'2 ='blahblah'它不会解析第二个选项。
$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 '</pre>';
答案 0 :(得分:0)
<?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解析器如何处理以数字开头的属性。
答案 1 :(得分:0)
由于$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;
<强>更新强>
您的EDIT从拥有一个<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;