Я пытаюсь получить подстроку между двумя строками, которая начинается с арабского слова تفاحة
и заканчивается --------------------------------------<br>
Мой текущий код хорошо работает для поиска подстроки между двумя английскими словами, но не работает, если начальное слово арабское. Может ли кто-нибудь помочь мне, как решить эту проблему? Заранее спасибо.
<?
$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>
Редактировать:
Это новый пример ввода:
$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>
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>
خوخ:
<br><img src="http://asite.com/1.jpg"><br>
<a href="https://asite.com/1.html">خوخ</a> <br />
<a href="http://asite.com/linkpeach.html">link1خوخ </a> <br />
<a href="http://asite.com/linkpeach.html">link2خوخ </a> <br />
<a href="http://asite.com/linkpeach.html">link3خوخ </a> <br />
<a href="http://asite.com/linkpeach.html">link4خوخ </a> <br />
<a href="http://asite.com/linkpeach.html">link5خوخ </a> <br />
--------------------------------------<br>
STR;
$start = 'تفاحة:';
$end = '--------------------------------------<br>';
//var_dump(get_string_between($str, $start, $end));
$parsed2 = get_string_between($str, $start, $end);
echo "found :".$parsed2;
При работе с кодировкой символов UTF-8 возникает RTL маркер который обозначает, как исходные символы группируются при визуализации на экране, например, справа налево, что кодируется 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
вместо strpos
а также mb_substr
вместо substr
,
Другой способ реорганизовать вашу функцию, чтобы она хорошо работала как с многобайтовым, так и с однобайтовым поиском по подстроке, — это просто превратить шаблон поиска в регулярное выражение и использовать поиск по регулярному выражению для извлечения желаемой подстроки. Это значит полагаться на u
Модификатор UTF-8 в вашем образце.
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 />
"
*/
Других решений пока нет …