php截取字符串 xml,使用PHP提取字符串的一些XML标记

我有以下功能:

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-MailsE-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-MailsE-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值