2016-08-18 12 views
1

Я пытаюсь получить подстроку между двумя строками, которые начинаются с арабским словом تفاحة и заканчивается --------------------------------------<br>Как получить подстроку между словом справа налево (арабское) и тегом с использованием php?

Моего текущий код работает хорошо для нахождения подстроки между двумя английскими словами, но терпит неудачу, если начинаешь слово является арабским. Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо.

<? 

$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; 

?> 

Полный пример строки для получения данных между двумя строками:

تفاحة: 
<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> 

Edit: Это новый вход образца:

$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 t-to-left, который кодируется 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 не волнует, как они» re отображается на экране.

Кроме того, обратите внимание, что вы должны использовать multibyte versions of string functions при работе с многобайтными кодировками, такие как mb_strpos вместо strpos и mb_substr вместо substr.

Еще один способ реорганизовать вашу функцию так, чтобы она хорошо работала с поиском в виде многобайтовых и однобайтовых подстрок, заключалась в том, чтобы просто превратить шаблон поиска в регулярное выражение и полагаться на поиск регулярных выражений, чтобы извлечь нужную подстроку. Это означает, что вы используете 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

Спасибо за ответ. Я попытался использовать ваш метод, но, к сожалению, он помещает все содержимое return_content вместо блока, который мне нужен! Как использовать переменную внутри шаблона? Я хочу использовать метод get method внутри него. – user1788736

+0

Пожалуйста, взгляните на мое редактирование. Я реорганизовал вашу функцию, чтобы работать в соответствии с вашими требованиями. Попробуйте использовать обновленную версию функции 'get_string_between()' в своем ответе и дайте мне знать, если это сработает для вас. – Sherif

+0

Я использовал вашу версию get_string_between, и у меня не было никаких данных: $ parsed2 = get_string_between2 ($ return_content, $ SearchWord_Value, '--------------------- -----------------
'); echo "

Найдено:
". $ Parsed2; – user1788736

 Смежные вопросы

  • Нет связанных вопросов^_^