2016-11-14 25 views
2

私の文を2つの部分に分けたいと思います。彼らは英語の手紙と非英語の手紙でできているからです。私は正規表現を使用して、通常の文字と文字を得るためのpreg_splitメソッドを使用しています。これは反対ですが、私は英語だけではなく、日本語でのみ残されています。私が一緒に仕事preg_splitを英語で分割した文字列(英語以外の文字)

文字列:

すぐに諦めて昼寝をするかも知れない。 I may give up soon and just nap instead. 

私の試み:あなたが見ることができるように

$parts = preg_split("/[ -~]+$/", $cleanline); // $cleanline is the string above 
      print_r($parts); 

マイ結果

Array ([0] => すぐに諦めて昼寝をするかも知れない。 [1] =>) 

、私は空の第2の値を得ますか。英語と英語以外のテキストを2つの異なる文字列に変換するにはどうすればよいですか?正しい正規表現を使用しても(私がテストしたものから)英語のテキストが返されないのはなぜですか?

+1

この '[ - 〜]'スペースとチルダとの間の範囲である、あなたは何を期待しているということでしょうか?私はあなた自身の文字列としてすべての英語の単語を与える ' - 〜] +'と、1つのインデックス(またはスペースがあれば複数のもの)として非英語を欲しいと思います。 '-'はエスケープされていないか、文字クラスの最初/最後の文字でない限り範囲です。 – chris85

+0

'/(。+)([ - 〜])+ $ /'別のものをキャプチャしたいテキストをキャプチャグループに入れる必要があると思われます。 –

+0

@RedMercury 'preg_split'はキャプチャしません。 – chris85

答えて

2

lookaround t O非アルファベットとアルファベット+空間との間の境界に

$str = 'すぐに諦めて昼寝をするかも知れない。 I may give up soon and just nap instead.'; 
$parts = preg_split("/(?<=[^a-z])(?=[a-z\h])|(?<=[a-z\h])(?=[^a-z])/i", $str, 2); 
print_r($parts); 

出力を分割:

Array 
(
    [0] => すぐに諦めて昼寝をするかも知れない。 
    [1] => I may give up soon and just nap instead. 
) 
+0

ありがとう!私は現在 '$ parts = preg_split("/[A-Za-z0-9_〜\ - !@#\ $%\ ^&\ * \(\)] |(?<= [az \ h])( ?= [^ az])/ i "、$ cleanline、2);'時には何らかの理由で最初の大文字を切り捨てます。 – mpj

2

preg_split関数の代わりにmb_splitを試してください。

mb_regex_encoding('UTF-8'); 
mb_internal_encoding("UTF-8"); 
$parts = mb_split("/[ -~]+$/", $cleanline); 
+0

'mb_split'は他のPHP正規表現関数と異なり、区切り文字を使用しませんが、それは問題ではありません。正規表現が問題です。 – chris85

2

あなたの例に示すように2つの文字列の間に2つのスペースを持っている場合は、あなたが簡単な\s{2}で簡単にそれらを分割することができます:

<?php 
$s = "すぐに諦めて昼寝をするかも知れない。 I may give up soon and just nap instead."; 
$s = preg_split("/\s{2}/", $s); 
print_r($s); 
?> 

出力:

Array 
(
    [0] => すぐに諦めて昼寝をするかも知れない。 
    [1] => I may give up soon and just nap instead. 
) 

デモ: http://ideone.com/uD2W1Q

関連する問題