我使用此正则表达式^([\S\s]{50,400}[\.\!\?])(?:\s|)[A-Z]
在regexr.com和regex101中正常工作。它在我的网站上运行得相当好,只是在少数情况下它没有捕获我想要的文本。碰巧有时代码远远超过想要的文本,但它适用于上述网站。任何人都知道为什么会这样?这里是php代码:
preg_match('/^([\S\s]{50,400}[\.\!\?])(?:\s|)[^\s]/', $descr, $matches);
if(isset($matches[1]))$descr = $matches[1];
此外,我的正则表达式不起作用的情况之一(在我的PHP代码中):
Dieses Luxus-Apartmentanlage liegt nur 50 m vom Strand entfernt und in 5/10 Minuten sindzuFußderreizvolle traditionelle Fischerhafen von Cala Bona sowie dieSträndevonCala Bona und Port Verd zu erreichen。 Die Anlage besteht auszweiGebäudenmitje sechs Wohnungen,durch einen gemeinsamen Zugangsbereich miteinander verbunden。 DieGebäudesindmit einemAufzugfürdenbequemen Zugang von der Tiefgarage ausgestattet。 Es stehen zwei oder drei Zimmer-Wohnungen,miteinerGesamtwohnflächevon80 m2 bis 85 m2zurVerfügungDieWohnungen im Erdgeschoss profitieren vonprivatenGärtenundgrossen Terrassen。 Die im ersten Stock gelegenen WohnungenhabengroßzügigeTerrassenund die vierDachgeschosswohnungenverfügenüber50m2 grosse SonnenterrassenmitpektakuläremBlickauf das Meer und die Berge。 Jede Wohnung bietet auch einen eigenen Parkplatz undAbstellraumfürFahrräderundKoffer等.Die Anlage wurde von einem der renommiertesten Architekten entworfen,in einem traditionellen mediterranen Stil。
这应该是应该抓住的:
Dieses Luxus-Apartmentanlage liegt nur 50 m vom Strand entfernt und in 5/10 Minuten sindzuFußderreizvolle traditionelle Fischerhafen von Cala Bona sowie dieSträndevonCala Bona und Port Verd zu erreichen。 Die Anlage besteht auszweiGebäudenmitje sechs Wohnungen,durch einen gemeinsamen Zugangsbereich miteinander verbunden。
如果我们100%的时间让它工作,那么代码可能会帮助某人:)
答案 0 :(得分:0)
此代码应该适合您
$re = '/^([\S\s]{50,400}[\.\!\?])(?:\s[A-Z])/';
$str = 'Dieses Luxus-Apartmentanlage liegt nur 50 m vom Strand entfernt und in 5/10 Minuten sind zu Fuß der reizvolle traditionelle Fischerhafen von Cala Bona sowie die Strände von Cala Bona und Port Verd zu erreichen. Die Anlage besteht aus zwei Gebäuden mit je sechs Wohnungen, durch einen gemeinsamen Zugangsbereich miteinander verbunden. Die Gebäude sind mit einem Aufzug für den bequemen Zugang von der Tiefgarage ausgestattet. Es stehen zwei oder drei Zimmer-Wohnungen, mit einer Gesamtwohnfläche von 80 m2 bis 85 m2 zur Verfügung Die Wohnungen im Erdgeschoss profitieren von privaten Gärten und grossen Terrassen. Die im ersten Stock gelegenen Wohnungen haben großzügige Terrassen und die vier Dachgeschosswohnungen verfügen über 50 m2 grosse Sonnenterrassen mit spektakulärem Blick auf das Meer und die Berge. Jede Wohnung bietet auch einen eigenen Parkplatz und Abstellraum für Fahrräder und Koffer etc. .. Die Anlage wurde von einem der renommiertesten Architekten entworfen , in einem traditionellen mediterranen Stil .';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches[0][1]);
它匹配组1中的所需结果。请参阅online compiler
中的结果或者您可以使用代码
$re = '/^([\S\s]{50,400}[\.\!\?])(?:\s[A-Z])/';
$str = 'Dieses Luxus-Apartmentanlage liegt nur 50 m vom Strand entfernt und in 5/10 Minuten sind zu Fuß der reizvolle traditionelle Fischerhafen von Cala Bona sowie die Strände von Cala Bona und Port Verd zu erreichen. Die Anlage besteht aus zwei Gebäuden mit je sechs Wohnungen, durch einen gemeinsamen Zugangsbereich miteinander verbunden. Die Gebäude sind mit einem Aufzug für den bequemen Zugang von der Tiefgarage ausgestattet. Es stehen zwei oder drei Zimmer-Wohnungen, mit einer Gesamtwohnfläche von 80 m2 bis 85 m2 zur Verfügung Die Wohnungen im Erdgeschoss profitieren von privaten Gärten und grossen Terrassen. Die im ersten Stock gelegenen Wohnungen haben großzügige Terrassen und die vier Dachgeschosswohnungen verfügen über 50 m2 grosse Sonnenterrassen mit spektakulärem Blick auf das Meer und die Berge. Jede Wohnung bietet auch einen eigenen Parkplatz und Abstellraum für Fahrräder und Koffer etc. .. Die Anlage wurde von einem der renommiertesten Architekten entworfen , in einem traditionellen mediterranen Stil .';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
// Print the entire match result
var_dump($matches[1][0]);
答案 1 :(得分:0)
好的,我明白了!这个问题是由前面有空格的换行引起的。这有效:^([\S\s]{50,400}[\.\!\?])(?:\s?\s)[A-Z]
。表达式肯定可以优化,您可能会有一些建议。谢谢大家的帮助!
答案 2 :(得分:0)
我有几点要注意。
u
UNICODE修饰符。它将启用2个PCRE标志:它使PCRE引擎能够将字符串作为UTF8字符串处理(通过打开PCRE_UTF8
动词)并使模式中的速记字符类识别为Unicode(通过启用PCRE_UCP
动词) 。 \s?\s[^\s]
和类似模式没有多大意义。 (?:\s|)
模式匹配1个单个空格,1或0次(因此,此空白是可选的)。 [^\s]
匹配任何char但是空格,因此它等于\S
。因此,句子的结尾必须跟随1或0个空格,然后是非空格。删除(?:\s?\s)[A-Z]
或(?:\s|)[^\s]
,或者替换为@Toto建议,使用预测(?=\s+\p{Lu}|$)
以确保您还匹配最后一句和与该模式重叠的其他句子(如果您当然也在使用m
修饰符,因为模式中有^
个锚点!
,?
和.
。它们在[...]
内没有特殊含义。[\s\S]
来匹配任何char。您可以仅使用.
并传递PCRE_DOTALL(s
)修饰符。这是一种更原生,更直接的方式来匹配PHP正则表达式中的任何字符。所以,我建议
'/^.{50,400}[.!?](?=\s+\p{Lu}|$)/us'
<强>详情
^
- 字符串的开头(或传递m
修饰符的行).{50,400}
- 尽可能多的50到400个字符[.!?]
- .
,!
或?
字符(?=\s+\p{Lu}|$)
- 当前位置的右侧必须有1+个空格和任何大写字母或字符串结尾(如果传递m
修饰符,则为行)。 preg_match('/^.{50,400}[.!?](?=\s+\p{Lu}|$)/us', $descr, $matches);
echo $matches[0];
// => Dieses Luxus-Apartmentanlage liegt nur 50 m vom Strand entfernt und in 5/10 Minuten sind zu Fuß der reizvolle traditionelle Fischerhafen von Cala Bona sowie die Strände von Cala Bona und Port Verd zu erreichen. Die Anlage besteht aus zwei Gebäuden mit je sechs Wohnungen, durch einen gemeinsamen Zugangsbereich miteinander verbunden.