в php я хочу взорвать строку с тегом, используя utf-8 между ними, например, в этом тексте:
$content = "<heading>فهرست اول</heading>hi my name is mahdi whats app <heading>فهرست دوم</heading>how are you";
в том, что у меня есть <heading></heading>
с utf8 между ними, я хочу иметь простой массив с ними, например:
$arr[0] = "<heading>فهرست اول</heading>hi my name is mahdi whats app"; $arr[1] = "<heading>فهرست دوم</heading>how are you";
строки между <heading></heading>
различаются, как я могу создать этот массив? вопрос в том, как я могу взорвать текст <heading>ENY TEXT</heading>
Вы можете использовать preg_split
для разделения текста на регулярное выражение, а затем array_filter
для удаления пустых строк:
$arr = array_filter(preg_split('/(?=<heading>.*?<\/heading>)/', $contents), 'strlen');
Он не удалит тег, поскольку он находится в режиме look-ahead
– групповая конструкция, которая не потребляет то, что она сопоставила.
Например:
<heading>فهرست اول</heading>hi my name is mahdi whats app <heading>فهرست دوم</heading>how are you
Это должно возвратиться:
array( [0] => "<heading>فهرست اول</heading>hi my name is mahdi whats app ", [1] => "<heading>فهرست دوم</heading>how are you" )
Вы можете проверить это регулярное выражение онлайн: https://regex101.com/r/ITi7Lh/1
Или, если хотите, посмотрите, как PHP анализирует его: (ссылка, похоже, не работает на SO, вам нужно вручную вставить ее): https://en.functions-online.com/preg_split.html?command={"pattern":"\/(?=<heading>.*?<\\\/heading>)\/","subject":"<heading>\u0641\u0647\u0631\u0633\u062a \u0627\u0648\u0644<\/heading>hi my name is mahdi whats app <heading>\u0641\u0647\u0631\u0633\u062a \u062f\u0648\u0645<\/heading>how are you","limit":-1}
Вы можете использовать strpos и Substr, чтобы сделать то же самое, если ваш UTF вызывает проблемы.
Это будет цикл, пока он больше не сможет найти заголовок, а затем добавит последний Substr после цикла.
$content = "<heading>فهرست اول</heading>hi my name is mahdi whats app <heading>فهرست دوم</heading>how are you<heading>فهرست اول</heading>hi my name is mahdi whats app2 <heading>فهرست دوم</heading>how are you2"; $oldpos =0; $pos =strpos($content, "<heading>",1); // offset 1 to exclude first heading. While($pos !== false){ $arr[] = Substr($content, $oldpos, $pos-$oldpos); $oldpos = $pos; $pos =strpos($content, "<heading>",$oldpos+1); //offset previous position + 1 to make sure it does not catch the same again } $arr[] = Substr($content, $oldpos); // add last one since it does not have a heading tag after itself. Var_dump($arr);
Вы можете использовать preg_match
или в вашем случае preg_match_all
:
$content = "<heading>فهرست اول</heading>hi my name is mahdi whats app <heading>فهرست دوم</heading>how are you"; preg_match_all("'<heading>.*?<\/heading>'si", $content, $matches); print_r($matches[0]);
дает:
Array ( [0] => <heading>فهرست اول</heading> [1] => <heading>فهرست دوم</heading> )
Вы можете попробовать следующую функцию, она должна хорошо соответствовать вашим потребностям. В принципе, вы должны разделить массив, используя <heading>
как разделитель, и каждый элемент в результирующем массиве будет тем, что вам нужно, но тег заголовка будет удален, так как это то, что вы разделили, поэтому вам нужно добавить его назад. Есть комментарии, объясняющие, что делает код.
function get_what_mahdi_wants($in_string){ $mahdis_strings_array = array(); // Split string at occurrences of '<heading>' $mahdis_strings = explode('<heading>', $in_string); foreach($mahdis_strings as $mahdis_string){ // if '<heading>' is found at start of string, empty array element will be created. Skip it. if($mahdis_string == ''){ continue; } // Add back string element with '<heading>' tag prepended since exploding on it stripped it. $mahdis_strings_array[] = '<heading>'.$mahdis_string; } return $mahdis_strings_array; }