PHP使用UTF8在标签之间分解带有标签的字符串

时间:2017-09-18 14:53:10

标签: php

php中的

我想在它们之间使用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>

分解文本

4 个答案:

答案 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。

https://3v4l.org/UPfbb

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