PHP 简单 HTML DOM 解析器删除字符 / str_replace
PHP Simple HTML DOM Parser remove characters / str_replace
目前正在使用 PHP 简单 HTML DOM 解析器并遇到一个非常奇怪的场景。
我正在抓取一组网址,并使用以下网址获取我需要的信息:
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = $article->find('.product_price', 0)->plaintext;
$data[] = $item;
}
}
然后我得到如下结果,这就是我需要的:
Array
(
[0] => Array
(
[title] => title 0
[link] => link 0
[price] => £26.99
)
[1] => Array
(
[title] => title 1
[link] => link 1
[price] => £27.99
)
[2] => Array
(
[title] => title 2
[link] => link 2
[price] => £30.99
)
)
然后我循环遍历数据,将其添加到我的数据库中。
foreach($data as $result){
//insert data here//
}
然后我需要从价格中删除 £
符号。我只是在做这样的 str_replace:
$price = str_replace('£', '', $result['price']);
由于某些奇怪的原因,£
没有被删除。我不确定是 dom 解析器导致问题,还是 str_replace 只是因为某种原因无法正常工作。
为什么这不起作用?
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = $article->find('.product_price', 0)->plaintext;
$data[] = $item;
}
}
替换成这个就可以了
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = trim(str_replace('£', '',$article->find('.product_price', 0)->plaintext));
$data[] = $item;
}
}
无需再循环
有很多方法可以做到这一点。
首先,您可以阅读 Multibyte String Functions
之后,您可以使用带有 UTF-8 选项的 preg_replace 函数。
最后还可以使用字符的ASCII码
第一个例子:
$tab['price'] = '£26.99';
$tab['price'] = preg_replace('#£#u', '', $tab['price']);
结果:
Array
(
[price] => 26.99
)
注意正则表达式后面的 "u"。
第二个例子:
echo ord('£'); // show 194
$price=str_replace(chr(194),'',$price);
echo $price; // show 26.99
嗯,str_replace() 有效,请参阅 http://ideone.com/C5O2LW
备选方案:
使用NumberFormatter::parseCurrencyhttp://php.net/manual/de/numberformatter.parsecurrency.php
$output = (float) substr($input, strpos($input, "£") + 1);
$output = floatval(ltrim($input,"£"));
你不需要 preg_*
函数
目前正在使用 PHP 简单 HTML DOM 解析器并遇到一个非常奇怪的场景。
我正在抓取一组网址,并使用以下网址获取我需要的信息:
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = $article->find('.product_price', 0)->plaintext;
$data[] = $item;
}
}
然后我得到如下结果,这就是我需要的:
Array
(
[0] => Array
(
[title] => title 0
[link] => link 0
[price] => £26.99
)
[1] => Array
(
[title] => title 1
[link] => link 1
[price] => £27.99
)
[2] => Array
(
[title] => title 2
[link] => link 2
[price] => £30.99
)
)
然后我循环遍历数据,将其添加到我的数据库中。
foreach($data as $result){
//insert data here//
}
然后我需要从价格中删除 £
符号。我只是在做这样的 str_replace:
$price = str_replace('£', '', $result['price']);
由于某些奇怪的原因,£
没有被删除。我不确定是 dom 解析器导致问题,还是 str_replace 只是因为某种原因无法正常工作。
为什么这不起作用?
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = $article->find('.product_price', 0)->plaintext;
$data[] = $item;
}
}
替换成这个就可以了
foreach($urls as $url) {
$html = file_get_html($url);
foreach($html->find('.product4block') as $article) {
$item['title'] = $article->find('.product4text', 0)->plaintext;
$item['link'] = $article->find('.product4text a', 0)->href;
$item['price'] = trim(str_replace('£', '',$article->find('.product_price', 0)->plaintext));
$data[] = $item;
}
}
无需再循环
有很多方法可以做到这一点。 首先,您可以阅读 Multibyte String Functions
之后,您可以使用带有 UTF-8 选项的 preg_replace 函数。
最后还可以使用字符的ASCII码
第一个例子:
$tab['price'] = '£26.99';
$tab['price'] = preg_replace('#£#u', '', $tab['price']);
结果:
Array
(
[price] => 26.99
)
注意正则表达式后面的 "u"。
第二个例子:
echo ord('£'); // show 194
$price=str_replace(chr(194),'',$price);
echo $price; // show 26.99
嗯,str_replace() 有效,请参阅 http://ideone.com/C5O2LW
备选方案:
使用NumberFormatter::parseCurrencyhttp://php.net/manual/de/numberformatter.parsecurrency.php
$output = (float) substr($input, strpos($input, "£") + 1);
$output = floatval(ltrim($input,"£"));
你不需要
preg_*
函数