我想在它们之间使用utf-8来爆炸带有标记的字符串,例如,在本文中:
$content = "<heading>فهرست اول</heading>hi my name is mahdi whats app <heading>فهرست دوم</heading>how are you";
因为我必须在它们之间使用utf8标记<heading></heading>
,我希望像下面一样使用简单的数组:
$arr[0] = "<heading>فهرست اول</heading>hi my name is mahdi whats app";
$arr[1] = "<heading>فهرست دوم</heading>how are you";
<heading></heading>
之间的字符串是不同的,我如何制作这个数组?问题是如何通过<heading>ENY TEXT</heading>
答案 0 :(得分:2)
您可以使用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}
答案 1 :(得分:2)
如果您的UTF导致问题,您可以使用strpos和Substr执行相同的操作。
这将循环,直到它找不到标题,然后在循环后添加最后一个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);
答案 2 :(得分:1)
您可以使用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>
)
答案 3 :(得分:1)
您可以尝试以下功能,它应该很好地满足您的需求。基本上你应该使用<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;
}