微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析数组中的 BBCode

如何解决解析数组中的 BBCode

我正在尝试从 BBCode 调用函数(如 wordpress 简码)。但我没有找到任何代码来做到这一点,只有我找到了 HTML 标签解析器,如:

[bold]Bold text[/bold]
->
<b>Bold text</b>

但是我想把它保存为一个数组,例如:

[date format="j M,Y" type="jalali"]

像这样:

array(
    'date' => array(
        'format' => 'j M,Y','type' => 'jalali'
    )
)

*已编辑

我做了一个代码来做到这一点(对不起,如果我的英语不好):

[date format="Y/m/d" type="jalali"] =>

Step 1: Get code between "[" and "]":
date format="Y/m/d" type="jalali"

Step 2: Explode space in the code:
$code = array('date','format="Y/m/d"','type="jalali"')

Step 3: Get shortcode name(offset 0 of $code) and get
difference($code excluded offset 0):
$name = 'date'
$attr = array('format="Y/m/d"','type="jalali"')

Step 4: Now I have attributes and code name. But the problem is if
put space in attributes value it will explode that too:
[date format="j M,Y" type="jalali"] =>
$code = array('date','format="j','M,',' Y"','type="jalali"');

现在我该如何解决这个问题或使用正则表达式或其他任何东西获取名称属性

解决方法

你可以试试这个使用正则表达式

$code = '[date format="j M,Y" type="jalali"]';

preg_match_all("/\[([^\]]*)\]/",$code,$matches);

$codes = [];

foreach($matches[1] as $match) {
  // Normalize quotes into double quotes
  $match = str_replace("'",'"',$match);
  // Split by space but ignore inside of double quotes
  preg_match_all('/(?:[^\s+"]+|"[^"]*")+/',$match,$tokens);
  $parsed = [];
  $prevToken = '';
  foreach($tokens[0] as $token) {
    if(strpos($token,'=') !== false) {
      if($prevToken !== '') {
        $parts = explode('=',$token);
        $parsed[$prevToken][$parts[0]] = trim($parts[1],'"\''); 
      }
    } else {
      $parsed[$token] = [];
      $prevToken = $token;
    }
  }

  $codes[] = $parsed;
}

var_dump($codes);

结果:

array(1) {
  [0]=>
  array(1) {
    ["date"]=>
    array(2) {
      ["format"]=>
      string(6) "j M,Y"
      ["type"]=>
      string(6) "jalali"
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?