我正在解析HTML字符串以获取PHP中的值并将其写入数据库。这是一个示例字符串:
<b>Adress:</b> 22 Examplary road, Nowhere <br>
<b>Phone:</b> +371 12345678, +371 23456789<br>
<b>E-mail: </b>info@example.com<br>
字符串可以随机方式格式化。它可以包含我没有解析的其他键,它可以包含重复的键。它也可以只包含我感兴趣的一些键或完全为空。 HTML也可能被破坏(示例标记:<br
)。我已决定遵循条目由\n
分隔的规则,其格式为key: value
+一些HTML。
首先,我使用此代码使字符串可解析:
$parse = strip_tags($string);
$parse = str_replace(':', '=', $parse);
$parse = str_replace("\n", '&', $parse);
$parse = str_replace("\r", '', $parse);
$parse = str_replace("\t", '', $parse);
我的字符串现在看起来像这样:
Adress= 22 Examplary road, Nowhere&Phone= +123 12345678, +123 23456789&E-mail= info@example.com
然后我使用parse_str()
获取值,然后在找到所需的键时取出值:
parse_str($parse, $values);
$address = null;
if (isset($values['Adress']))
$address = trim($values['Adress']);
$phone = null;
if (isset($values['Phone']))
$phone = trim($values['Phone']);
问题是我最终得到了$phone = '371 12345678, 371 23456789'
- 我失去了+
个标志。如何保存这些?
另外,如果您有任何提示如何改进此程序,我很高兴知道这一点。有些条目有Website: example.com
,其他条目有Web Site example.com
...我很确定无法自动解析所有信息,但我正在寻找最佳解决方案。
使用WEBjuju提供的提示我现在正在使用:
preg_match_all('/([^:]*):\s?(.*)\n/Usi', $string, $matches, PREG_SET_ORDER);
$values = [];
foreach ($matches as $match)
{
$key = strip_tags($match[1]);
$key = trim($key);
$key = mb_strtolower($key);
$key = str_replace("\s", '', $key);
$key = str_replace('-', '', $key);
$value = strip_tags($match[2]);
$value = trim($value);
$descriptionValues[$key] = $value;
}
这允许我从这个输入中获取:
<b>Venue:</b> The Hall<br
<b>Adress:</b> 22 Examplary road, Nowhere <br>
<b>Phone:</b> +371 12345678<br>
<b>E-mail: </b>info@hkliepaja.lv<br>
<b>Website:</b> <a href="http://example.com/" target="_blank">example.com</a><br>
一个漂亮的PHP数组,具有同质化和希望可识别的键:
[
'venue' => 'The Hall',
'adress' => '22 Examplary road, Nowhere',
'phone' => '+371 12345678',
'email' => 'info@example.com',
'website' => 'example.com',
];
它仍然没有考虑到冒号丢失的情况,但我认为我不能解决这个问题......
答案 0 :(得分:2)
意识到你有预先形成的HTML 符合简单的标准结构我可以告诉你,正则表达式匹配将是获取此数据的最佳方式。这是一个让你走上正轨的例子 - 我确信它并没有解决所有问题,但它解决了你在这篇文章中遇到的问题,你在那里遇到“找到关键/ var匹配”。
// now go get those matches!
preg_match_all('/<b>([^:]*):\s?<\/b>(.*)<br>/Usi', $string, $matches, PREG_SET_ORDER);
die('<pre>'.print_r($matches,true));
例如,这将输出如下内容:
Array
(
[0] => Array
(
[0] => <b>Adress:</b> 22 Examplary road, Nowhere <br>
[1] => Adress
[2] => 22 Examplary road, Nowhere
)
[1] => Array
(
[0] => <b>Phone:</b> +371 12345678, +371 23456789<br>
[1] => Phone
[2] => +371 12345678, +371 23456789
)
[2] => Array
(
[0] => <b>E-mail: </b>info@example.com<br>
[1] => E-mail
[2] => info@example.com
)
从那里开始,我不得不猜测你可以把它推进去。
答案 1 :(得分:1)
在将值放入字符串之前使用base64_encode()。在您收到此字符串的代码中,使用base64_decode()将其恢复。
<强> page1.php中强>
$string = '&Adress='.base64_encode('22 Examplary road, Nowhere').'&Phone='.base64_encode('+123 12345678, +123 23456789').'&Email='.base64_encode('info@example.com');
// string is sent via curl or some other transport to page2.php
<强>使page2.php 强>
parse_str($string);
echo base64_decode($Adress); // 22 Examplary road, Nowhere
echo base64_decode($Phone); // +123 12345678, +123 23456789
echo base64_decode($Email); // info@example.com