在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
函数的某种组合是最好的方法,还是有其他选择?任何指向正确方向的帮助都将受到赞赏。
答案 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;
}
一些注意事项:
答案 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 强>