如何正确提取PHP字符串中分隔的标点字符和符号?

如何正确提取PHP字符串中分隔的标点字符和符号?,php,Php,我在PHP中有一个字符串,我想提取分离的标点字符和符号,在MS Office中,这些字符和符号被检测为单词,这是一个示例: <?php $string='La edad de un personaje, ¿ha de escribirse con letras o con cifras? ¿ Y las fechas y las horas ? ¿ Y los ordinales ? no llevan un punto o una coma , separando los mil

我在PHP中有一个字符串,我想提取分离的标点字符和符号,在MS Office中,这些字符和符号被检测为单词,这是一个示例:

<?php 

$string='La edad de un personaje, ¿ha de escribirse con letras o con 
cifras? ¿ Y las fechas y las horas ? ¿ Y los ordinales ? no llevan un 
punto o una coma , separando los millares ( 25.957 o 1.859 ) . Los 
números de cuatro cifras NO llevarán separación (1859): y los números 
de cinco cifras o más NO llevarán : ni puntos ni comas, 
sino una separación ( 25 957 o 1 343 392 ) .';

?>
但问题是我获得了所有字符,包括那些没有分开的字符,其中一些字符被省略了:

, ? ? ? , ( . . ) . ( ) : : , ( ) .
我想得到这个结果:

¿ ? ¿ ? , ( ) . : ( ) .
我怎样才能修好它


我需要您的帮助。

您正在匹配所有标点符号,但没有指定周围必须有空格。将此限制添加到正则表达式中,如下所示:

preg_match_all('/(?=( [[:punct:]\d]+ ))/u', $string, $matches);

你能检查你想要的结果,或者解释如何得到它吗?
[:punct:
不包括
,因此你需要手动将它添加到字符集,或者使用unicode修饰符
/u
。有关更多信息,请参阅。
\d
的目的是什么?你没有提到任何关于获取数字的事情。谢谢你的回答,但是我看到这个符号
被省略了,我怎么能把它包含在表达式中?@NekoLopez啊,对了。您遇到了问题,因为这些是unicode字符。您需要为此启用unicode模式。请查看更新的答案。另外,请注意,当您记录结果时,您将看到标点符号的unicode表示,而不是标点符号本身。有3个unicode字符“?”,它只显示一个。在您指定的限制条件下,您只需要3个字符中的2个。尽管如此,其中一人失踪。这是因为如果两个匹配重叠,则只会显示第一个匹配。这发生在匹配项
“?”
“?”
之间,因为它们之间共享相同的空格字符。我已经更新了我的答案,以帮助处理这些案件。如果您遇到任何进一步的问题,这些问题可能超出了您最初问题的范围。在这种情况下,请提出包含新问题的新问题,而不是修改已解决的现有问题。
preg_match_all('/(?=( [[:punct:]\d]+ ))/u', $string, $matches);