【问题标题】:Extract amount with preg_match from string使用 preg_match 从字符串中提取金额
【发布时间】:2016-01-14 15:59:11
【问题描述】:

我正在尝试从以下字符串/文本中提取金额:

Offerlist: 19939 Product: Technic Time: 13.01.16 - 14:08 Delivery: txt Offer36: 0,00 EUR Offer38: 185€ Best-Offer: 0,00 Offer5: 100 Offer1: 000000 Offer34: 80,00€ Offer5443: 185€ Offer876a: 00 Best-Offer: 200

我试过这个:

if (preg_match("/(?<=Offer1:)(.*?)(?=Offer34:)/s", $output, $result)) {
  $offer = trim($result[0]);
}

但问题是,如果名称或位置发生变化,脚本就不再起作用了。

【问题讨论】:

  • 请澄清一下,您只是想获得第一个报价值000000 还是全部?
  • 你想从那个字符串中得到什么?也许您可以使用:\h+([\d,]+)
  • 我试着把它们都弄下来。我必须可以搜索 Offer1 并获取金额。
  • :s 之后的所有值?例如你想要00000080,0018500200
  • 发布一个可重现的例子。

标签: php regex preg-match extract


【解决方案1】:

也许您应该搜索该值而不是其兄弟值。

所以下面的脚本应该会更好:

$dates = [];
if (preg_match_all("/(\w+\d*): (\d+(,\d+)?[€]?|\d\d\.\d\d.\d\d \- \d\d:\d\d|\w+)/s", $output, $result, PREG_SET_ORDER)) {
  foreach ($result as $data) {
    $dates[] = [$data[1] => $data[2]];
  }
}

【讨论】:

  • 这个版本在某种程度上破坏了 符号。
  • 没错,没有测试过,但如果你去掉它周围的方括号,它应该可以工作
【解决方案2】:

使用 preg_match_all() 和非常明确的编程可以这样完成:

$string = 'Offer1: 000000 Offer34: 80,00€ Offer5443: 185€ Offer876a: 00 Best-Offer: 200';

$regex = '/((best-)?offer[^:]*:)([ 0-9,€]+)/i';

preg_match_all($regex, $string, $matches);

$offers = [];
for($c = 0; $c < count($matches[1]); $c++) {
  $label = substr($matches[1][$c],0,-1);
  $offers[$label] = trim($matches[3][$c]);
}

var_dump($offers);

输出:

array(5) {
  ["Offer1"]=>
  string(6) "000000"
  ["Offer34"]=>
  string(8) "80,00€"
  ["Offer5443"]=>
  string(6) "185€"
  ["Offer876a"]=>
  string(2) "00"
  ["Best-Offer"]=>
  string(3) "200"
}

可以在http://sandbox.onlinephpfunctions.com/code/549db3d4d797e5821ede99612b18ac24d19ce9e8找到实时示例

【讨论】:

  • 如果我想用“:”获得所有价值,我必须改变什么?还有时间,产品?
猜你喜欢
  • 2022-08-03
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多