2016-08-18 50 views
1

私はアラビア語تفاحةで始まり、--------------------------------------<br>PHPを使って右から左(アラビア語)の単語とタグの部分文字列を取得する方法は?

私の現在のコードは2つの、英語の単語間の部分文字列を見つけるためによく働くが始まる言葉はアラビア語であれば失敗で終わる2つの文字列の間の部分文字列を取得しようとしています。どのように私はこの問題を解決する方法を助けることができますか?前もって感謝します。

<? 

$returned_content = get_data('./input.php'); 

$SearchWord_Value = $_GET['SearchWord']; 

/* gets the data from a URL */ 
function get_data($url) { 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function get_string_between($string, $start, $end){ 
    $string = ' ' . $string; 
    $ini = strpos($string, $start); 
    if ($ini == 0) return ''; 
    $ini += strlen($start); 
    $len = strpos($string, $end, $ini) - $ini; 
    return substr($string, $ini, $len); 
} 

$parsed = get_string_between($returned_content, $SearchWord_Value, '--------------------------------------<br>'); 

echo "<br><br>Found Block:<br>".$parsed; 

?> 

完全な文字列の例では、2つの文字列の間のデータを取得する:

تفاحة: 
<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/1.html">تفاحة</a> <br /> 

<a href="http://asite.com/link.html">link1 </a> <br /> 
<a href="http://asite.com/link.html">link2 </a> <br /> 
<a href="http://asite.com/link.html">link3 </a> <br /> 
<a href="http://asite.com/link.html">link4 </a> <br /> 
<a href="http://asite.com/link.html">link5 </a> <br /> 

--------------------------------------<br> 

編集: これは新しいサンプル入力です:

$str = <<<'STR' 
&#1578;&#1601;&#1575;&#1581;&#1577;: 
<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/1.html">&#1578;&#1601;&#1575;&#1581;&#1577;</a> <br /> 

<a href="http://asite.com/link.html">link1 </a> <br /> 
<a href="http://asite.com/link.html">link2 </a> <br /> 
<a href="http://asite.com/link.html">link3 </a> <br /> 
<a href="http://asite.com/link.html">link4 </a> <br /> 
<a href="http://asite.com/link.html">link5 </a> <br /> 

--------------------------------------<br> 
Mango: 
<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/Mango.html">Mango</a> <br /> 

<a href="http://asite.com/linkMango.html">link1Mango </a> <br /> 
<a href="http://asite.com/linkMango.html">link2Mango </a> <br /> 
<a href="http://asite.com/linkMango.html">link3Mango </a> <br /> 
<a href="http://asite.com/linkMango.html">link4Mango </a> <br /> 
<a href="http://asite.com/linkMango.html">link5Mango </a> <br /> 

--------------------------------------<br> 
&#1582;&#1608;&#1582;: 
<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/1.html">&#1582;&#1608;&#1582;</a> <br /> 

<a href="http://asite.com/linkpeach.html">link1&#1582;&#1608;&#1582; </a> <br /> 
<a href="http://asite.com/linkpeach.html">link2&#1582;&#1608;&#1582; </a> <br /> 
<a href="http://asite.com/linkpeach.html">link3&#1582;&#1608;&#1582; </a> <br /> 
<a href="http://asite.com/linkpeach.html">link4&#1582;&#1608;&#1582; </a> <br /> 
<a href="http://asite.com/linkpeach.html">link5&#1582;&#1608;&#1582; </a> <br /> 

--------------------------------------<br> 
STR; 

$start = '&#1578;&#1601;&#1575;&#1581;&#1577;:'; 
$end = '--------------------------------------<br>'; 

//var_dump(get_string_between($str, $start, $end)); 

$parsed2 = get_string_between($str, $start, $end); 

echo "found :".$parsed2; 

答えて

3

UTF-8文字エンコーディングを扱います、RTL markerがあります。これは、righのように、進行中の文字が画面上にレンダリングされたときにどのようにグループ化されるかを示します左から右へ、U+200Fでエンコードされています。これは、文字が画面にどのように表示されるかについてのみ重要ですが、必ずしもメモリにどのように格納されているかは重要ではありません。

たとえば、画面上に文字が左から右に表示されているにもかかわらず、文字列に文字列を分割すると、تが実際に最初に表示されます文字列に:コロン)が最後に表示されます。

$str = 'تفاحة:'; 

for($i = 0, $n = mb_strlen($str); $i < $n; $i++) { 
    var_dump(mb_substr($str, $i, 1)); 
} 
/* 
output would be... 

string(2) "ت" 
string(2) "ف" 
string(2) "ا" 
string(2) "ح" 
string(2) "ة" 
string(1) ":" 
*/ 

文字列中の全ての文字がバイトをただ並べられ、そしてPHPがどのように」気にしないので、あなたが実際に左から右対右から左のサブストリングを抽出しようとしていませんあなたの画面に表示されます。

または、そのようmb_strpos代わりのstrposmb_substr代わりのsubstrなどのマルチバイトエンコーディングを扱うときにmultibyte versions of string functionsを使用しなければならないことに注意してください。

マルチバイトとシングルバイトの部分文字列検索でうまく機能するように関数をリファクタリングするもう1つの方法は、検索パターンを正規表現に変換し、正規表現検索を使用して代わりに目的の部分文字列を抽出することです。これはあなたのパターンにu UTF-8 Pattern Modifierを依存させることを意味します。

function get_string_between($string, $start, $end) { 
    // make sure we escape all parts of the pattern 
    $start = preg_quote($start, '/'); 
    $end= preg_quote($end, '/'); 

    // create the pattern 
    $pattern = "/$start(.*?)$end/su"; // using s and u pattern modifiers 

    if (preg_match($pattern, $string, $match)) { 
     return $match[1]; 
    } 
} 


$str = <<<'STR' 
تفاحة: 
<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/1.html">تفاحة</a> <br /> 

<a href="http://asite.com/link.html">link1 </a> <br /> 
<a href="http://asite.com/link.html">link2 </a> <br /> 
<a href="http://asite.com/link.html">link3 </a> <br /> 
<a href="http://asite.com/link.html">link4 </a> <br /> 
<a href="http://asite.com/link.html">link5 </a> <br /> 

--------------------------------------<br> 
STR; 

$start = 'تفاحة:'; 
$end = '--------------------------------------<br>'; 

var_dump(get_string_between($str, $start, $end)); 

/* 
output 

string(380) " 

<br><img src="http://asite.com/1.jpg"><br> 
<a href="https://asite.com/1.html">تفاحة</a> <br /> 


<a href="http://asite.com/link.html">link1 </a> <br /> 
<a href="http://asite.com/link.html">link2 </a> <br /> 
<a href="http://asite.com/link.html">link3 </a> <br /> 
<a href="http://asite.com/link.html">link4 </a> <br /> 
<a href="http://asite.com/link.html">link5 </a> <br /> 

" 

*/ 
+0

返信ありがとうございます。私はあなたのメソッドを使用しようとしましたが、残念ながら、私が望むブロックではなく、返されたコンテンツ全体を置きました!私はそれの中でメソッドの変数を取得したい。 – user1788736

+0

私の編集を見てください。あなたの要求に応じてより機能するようにあなたの機能をリファクタリングしました。私の答えで 'get_string_between()'関数の更新版を使ってみて、それがうまくいくかどうかを教えてください。 – Sherif

+0

私はあなたのバージョンのget_string_betweenを使用しました。データはまったくありませんでした。$ parsed2 = get_string_between2($ returned_content、$ SearchWord_Value、 '--------------------- -----------------
'); エコー "

発見ブロック:
"。$ parsed2; – user1788736

関連する問題