考慮到這個函式
function Split_Sentence($string, $asalpha)
{
preg_match_all("~(?<han>p{Han} )|(?<alpha> [a-zd$asalpha] )|(? <other>S )~ui", $string, $out)
foreach($out as $group_key=>$group)
{
if(! is_numeric($group_key)
{
//丟棄有索引的組。
foreach($group as $i=> $v)
{
if(mb_strlen($v)
{
$res[$i]=['type'/span>=> $group_key,'text'=>$v】。]
}
}
}
}
ksort($res)。
return $res;
}
(其中$ashalpha是一系列的字符,無論如何都要匹配為 "alpha")
該函式用于決議一個句子,并將其分成漢字、字母或 "其他 "字符組。
標點符號似乎會破壞它,而我似乎無法弄清楚原因。如果涉及到標點符號,以標點符號開始的整個區塊就會被匹配為 "其他"。
例如,"hello 中國朋友 你好和歡迎"正確地回傳
。Array (
[0] => Array[/span
(
[型別] => 其他
[text] => hello
)
[1] =>Array
(
[型別] => 漢
[文本] => 中國朋友
)
[2] => Array[/span>]。
(
[型別] => 漢
[文本] => 你
)
[3] =>Array
(
[型別] => alpha
[text] =>and
)
[4] =>Array)
(
[型別] => alpha
[文本] => 歡迎
)
)
但"hello中國朋友,你好和歡迎"回傳
Array
(
[0] => Array[/span
(
[型別] => alpha
[text] => hello
)
[1] => [span class="hljs-keyword">Array] =>
(
[型別] => 漢
[文本] => 中國朋友
)
[2] => Array[/span>]。
(
[型別] => 其他
[text] => ,你好and。
)
[3] =>Array
(
[型別] => alpha
[文本] => 歡迎
)
)
我錯過了什么?
更新:問題似乎出在使用S 而不是S的 "其他 "組上。現在,雖然S將部分地解決這個問題,但每個 "其他 "字符都被單獨捕獲。另一方面,S 將捕獲多個 "其他 "字符作為一個組,但它也會包括漢字和阿爾法字符,直到它找到一個空格。
uj5u.com熱心網友回復:
逗號與S 匹配,因為S匹配任何字符,但空白,而S 模式匹配一個或多個出現的非空白的字符。它消耗了所有p{Han}可以匹配的字符。它還將消耗所有(?<alpha>[a-zd$asalpha] )可以匹配的字符。
如果你想從S中排除p{Han}和[a-zd$asalpha] ,請使用
(?<han>p{Han} )|(? <alpha>[a-zd$asalpha] )|(?<other>[^p{Han}a-zd$asalphas] )
參見這個詞組演示。[^p{Han}a-zd$asalphas] 匹配一個或多個除中文字符、ASCII小寫字母、數字、額外的$asalpha字符和空白字符以外的字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306672.html
標籤:
上一篇:本地主機上的PHP檔案禁止訪問
下一篇:與launchMode混淆
