【问题标题】:Matching Product Prices from an HTML text从 HTML 文本匹配产品价格
【发布时间】:2023-03-06 13:20:01
【问题描述】:

我正在尝试在字符串上使用简单的正则表达式来获取定价信息,但我的 preg_match_all 根本找不到它应该找到的内容。

我正在寻找例如$**.**£**.** 或有时货币符号可能被编码为 HTML 实体,例如对于英镑 ££

使用preg_match_all 查找 html 实体有问题吗?

这是我正在尝试的:

$price = preg_match_all(
    '#(?:\$|\£|\€|\£|\£)(\d+(?:\.\d+)?)#', 
    $string, 
    $matches
);

但我得到:未知修饰符“1”

【问题讨论】:

  • 请不要在没有 cmets 的情况下投票 - 这个问题有什么问题?
  • 您应该知道,在某些国家/地区,货币符号位于价格之后。另见那里的正则表达式:stackoverflow.com/questions/3517468/…
  • @MarvinLabs - 嗨,是的,我当然知道,您显示的帖子不会正则表达式货币只是一个数字,正在搜索的字符串也可能包含不是货币的数字

标签: php regex preg-match-all


【解决方案1】:

这里有一些明显的错误:

1) preg_match_all() 至少需要 3 个参数,所以它必须是

preg_match_all(
    '#(?:\$|\£|\€|\£|\£)(\d+(?:\.\d+)?)#', 
    $string, 
    $matches
);

$matches 变量将包含匹配的字符串。您的 $price 将包含模式匹配的次数。请参阅http://php.net/preg_match_all 了解更多信息。

2) 你有一个未转义的分隔符:

'#(?:\$|\£|\€|\£|\£)(\d+(?:\.\d+)?)#'
 ^                       ^                    ^
 Start                   Unescaped            End

解决这两个问题将使code run without any parsing errors。它还应该回答您关于匹配实体的字面问题。

但是,我有点怀疑 Regex 能否实现您想要做的事情。价格并不总是列出[CurrencySymbol][Amount]。例如,欧元通常写成 100 欧元或 100 欧元。所以你必须检查符号之前的数字和之后的空格。

【讨论】:

  • 我会接受这个答案,因为我想得越多,我就越觉得这是错误的做法!感谢您的帮助/建议,不胜感激。
猜你喜欢
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多