将带有简单标记的字符串分解为数组的最佳方法是什么?

时间:2016-07-19 13:00:26

标签: php arrays tags explode

在PHP中,我想找出最好的方法来获取包含一些简单标签的字符串,然后将其分解为多维数组,每个索引包含两个包含项tags和{{1}的数组}}。如果没有例外标记,text将是tags。如果字符串的一部分中存在一个(或多个)标记,则null将包含所有相关标记指示符的空格分隔列表。

示例:

字符串

tags

已处理数组

The __**quick** brown__ fox jumped __over the__ lazy dog.

我试图绕过这样做的最佳方式。这个概念看起来很简单,但是我想的越多,我对如何实现它就越困惑。在[ [ 'tags' => null, 'text' => 'The ', ], [ 'tags' => '__ **', 'text' => 'quick', ], [ 'tags' => '__', 'text' => ' brown', ], [ 'tags' => null, 'text' => ' fox jumped ', ], [ 'tags' => '__', 'text' => 'over the', ], [ 'tags' => null, 'text' => ' lazy dog.', ], ] 中使用preg_match函数的某种组合是最好的方法,还是有其他选择?任何指向正确方向的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

因为你有叠加标记,所以你需要一个堆栈来跟踪叠加层次。没有办法直接使用正则表达式,因此可能更容易迭代字符串符号。

首先:

By.cssSelector("form.itemscreen.addMode")

输出:

print_r(process("The __**quick** brown__ fox jumped __over the__ lazy dog."));

function process($str) {
  $str = '~~'.$str.'~~';
  $sz = strlen($str);

  $res = array();
  $stack = array();
  $text = '';

  for($n = 0; $n < $sz; $n++) {
    if(strpos('*_~', $c = $str[$n]) === false) {
      $text .= $c;
      continue;
    }
    if($text) {
      $res[] = array('text' => $text, 'tags' => implode(" ", array_slice($stack, 1)));
      $text = '';
    }
    $c .= $str[$n++];
    $c == end($stack) ? array_pop($stack) : $stack[] = $c;
  }
  return $res;
}

一些注意事项:

  • 此代码假定输入正确。它没有执行任何检查。
  • 在内部,整个字符串被封装到&#39; ~~&#39;标记。这样,字符串处理以标记&#39;的结尾结束。条件和最后一个待处理的文本块正确附加到结果集。 (叫我懒惰的狗这样做。)但是这个标记没有在最终结果中注入。

答案 1 :(得分:0)

魔鬼不像他画的那么黑。

$str = 'The __**quick** brown__ fox jumped __over the__ lazy dog.';

$t = array_map(function($i) { 
     $i = preg_split('/[^ A-Za-z]+\K/', $i,2); 
     if (count($i) == 1) array_unshift($i, null);
     return $i;
     },  preg_split('/[A-Za-z.,]\K(?=[^A-Za-z.,])/', $str));   
print_r($t);

<强> demo