我有一个简单的问题,但是我很难找到一个简单有效的解决方案。
由于我在第一次和第二次发布解决方法上都没有成功,因此我将在第三次尝试更直接的问题时进行尝试。
在网络上搜索后,我找到了一种处理德语和法语字符的解决方案,但是我得到的匹配项的根本问题是相同的。 我简化了脚本,以便任何人都可以尝试。
<?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而不是只有两个进行四场比赛?
先谢谢了。
答案 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);
我希望最后讲一下,但是您还说过您还有其他类型的字符串,因此在这种情况下,如果只需要其他字符串类型,最好保持正则表达式的方式进行模式修改。