取回正确数量的比赛

时间:2018-07-01 11:31:20

标签: php regex

我有一个简单的问题,但是我很难找到一个简单有效的解决方案。

由于我在第一次和第二次发布解决方法上都没有成功,因此我将在第三次尝试更直接的问题时进行尝试。

在网络上搜索后,我找到了一种处理德语和法语字符的解决方案,但是我得到的匹配项的根本问题是相同的。 我简化了脚本,以便任何人都可以尝试。

<?php

$lines=array("Ich weiß wirklich nicht, womit er prahlt!: I really 
don't know what he's bragging of!","Worüber hat er gesprochen?: what 
did he talked about?");

foreach($lines as $line){
  preg_match_all('/\b([A-Za-zäöüÖÄÜß\s\.,\'!\?])+([A-Za- 
z\s\.;\'\-!\?]+)/',$line,$lines1,PREG_PATTERN_ORDER);
  echo 'results = '.$lines1[0][0].'<BR>';
}
?>

从preg_match_all中我只有两场比赛:
结果= Ichwei�wirklich nicht,womit er prahlt!
结果=更安全吗?

但是从https://regexr.com/https://regex101.com/中,我得到了四个具有相同正则表达式的匹配项。

Ichweißwirklich nicht,womit er prahlt!
我真的不知道他在吹牛什么!
值得一试吗?
他说了什么?

有人知道为什么会有这种差异吗?如何使用preg_match_all而不是只有两个进行四场比赛?

先谢谢了。

1 个答案:

答案 0 :(得分:0)

如果所有字符串都用“:”分隔,则实际上不需要用字符进行匹配。使用正则表达式可以抓住“:”的左侧和右侧,以了解它们的含义。在您提供的测试字符串上可以正常工作。

$lines=array(
   "Ich weiß wirklich nicht, womit er prahlt!: I really don't know what he's bragging of!",
   "Worüber hat er gesprochen?: what did he talked about?"
);

$allItems=array();
$pattern = '/(.*?):\s?(.*?$)/s';
foreach($lines as $line){
   preg_match_all($pattern, $line, $result, PREG_PATTERN_ORDER);
   array_push($allItems, $result[1][0], $result[2][0]);
}

print_r($allItems);

输出

Array ( [0] => Ich weiß wirklich nicht, womit er prahlt! [1] => I really don't know what he's bragging of! [2] => Worüber hat er gesprochen? [3] => what did he talked about? )

编辑

对于这种特定情况,您可以完全不使用正则表达式,而是简单地使用它,结果输出将相同:

$lines=array(
   "Ich weiß wirklich nicht, womit er prahlt!: I really don't know what he's bragging of!",
   "Worüber hat er gesprochen?: what did he talked about?"
);

$allItems=array();
foreach($lines as $line){
   $values = explode(": ", $line);
   array_push($allItems, $values[0], $values[1]);
}

print_r($allItems);

我希望最后讲一下,但是您还说过您还有其他类型的字符串,因此在这种情况下,如果只需要其他字符串类型,最好保持正则表达式的方式进行模式修改。