Как получить подстроку между справа налево (арабское) слово и тег, используя php?

Я пытаюсь получить подстроку между двумя строками, которая начинается с арабского слова تفاحة и заканчивается --------------------------------------<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'
&#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;

1

Решение

При работе с кодировкой символов 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 />

"
*/
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]