如何解析字符串而不丢失PHP中的加号?

时间:2016-11-28 17:23:22

标签: php parsing html-parsing

我正在解析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',
];

它仍然没有考虑到冒号丢失的情况,但我认为我不能解决这个问题......

2 个答案:

答案 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