我有以下功能:
function translate($params) {
$xmldata = '<?xml version="1.0" encoding="UTF-8" ?>' . html_entity_decode($params['data']) . '';
$lang = ucfirst(strtolower($params['lang']));
if (simplexml_load_string($xmldata) === FALSE) {
return $params['data'];
} else {
$langxmlobj = new SimpleXMLElement($xmldata);
if ($langxmlobj -> $lang) {
return ($langxmlobj -> $lang);
} else {
return $params['data'];
}
}
}
哪个适用于以下字符串:
$params['data'] = 'HelloBonjour';
$params['lang'] = 'English';
print translate($params);
它输出:
Hello
但……
当字符串中包含任何其他标记时:
$params['data'] = '
Hello
Bonjour
';$params['lang'] = 'English';
它没有输出任何东西;
我希望它输出:
Hello
or any other tag within the拉出我的头发;任何的想法 ?
VERSION2:
当字符串如下时它不起作用:
$data = '25 GBEspace disque25 GBDisk Space
YESPHP 5, MySQL 5YESPHP 5, MySQL 5
100Bases de données100Databases
∞E-Mails∞E-mails';
解决方法:
你的问题有两个部分.
>将带有标签的片段加载到XML文档中
>从XML获取数据
将数据加载到XML中
这里的主要问题是它不是有效的XML片段,而是HTML片段与某些特定标签的混合.幸运的是DOMDocument可以加载(和修复)HTML.默认情况下,这不会将数据加载为UTF-8,您需要添加指定编码的元标记.
$data = '25 GBEspace disque25 GBDisk Space
YESPHP 5, MySQL 5YESPHP 5, MySQL 5
100Bases de données100Databases
∞E-Mails∞E-mails';
$html_data =
'
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom->loadHtml($html_data);
$dom->formatOutput = TRUE;
echo $dom->saveXml();
输出:
25 GBEspace disque 25 GBDisk Space YESPHP 5, MySQL 5 YESPHP 5, MySQL 5...
如您所见,它保留语言名称元素,但将所有名称转换为小写.如果它们丢失,它总是添加html和body元素,但这不是问题.
从XML获取数据
现在你有了一个DOM,你可以使用XPath来获取节点.
一种可能性是获取body元素并将其导入SimpleXML:
$xpath = new DOMXpath($dom);
$root = simplexml_import_dom($xpath->evaluate('/html/body')->item(0));
var_dump($root);
输出:
object(SimpleXMLElement)#4 (2) {
["french"]=>
array(4) {
[0]=>
object(SimpleXMLElement)#3 (1) {
["li"]=>
object(SimpleXMLElement)#12 (1) {
["span"]=>
string(5) "25 GB"
}
}
...
}
["english"]=>
array(4) {
[0]=>
object(SimpleXMLElement)#5 (1) {
["li"]=>
object(SimpleXMLElement)#12 (1) {
["span"]=>
string(5) "25 GB"
}
}
...
或直接获取节点并将其保存为HTML片段:
$xpath = new DOMXpath($dom);
$string = '';
foreach ($xpath->evaluate('/html/body/*[name() = "english"]/*') as $node) {
$string .= $dom->saveHtml($node);
}
echo $string;
输出:
25 GBDisk Space
YESPHP 5, MySQL 5
100Databases
∞E-mails
标签:php,xml,simplexml
来源: https://codeday.me/bug/20190628/1320058.html