PHPBB的BBCode到HTML(正则表达式或其他方式)(phpbb BBCode to HTML

2019-10-21 10:02发布

我在迁移的内容从phpBB的使用WordPress的过程。 我已经suceeded达到翻译的bbcode到HTML的地步。

BB代码的由被注入每个标签的字母数字字符串复杂。

一个常见的职位将包含类似这样的文字...

[url=url] Click here [/url:583ow9wo]

[b:583ow9wo] BOLD [/b:583ow9wo]

[img:583ow9wo] jpg [/img:583ow9wo]

我初出茅庐使用正则表达式,但认为这可能是一条出路,因为我发现从以下后一些帮助https://stackoverflow.com/a/5505874/4356865 (使用正则表达式[/ B:\ d {5} ]),但在这种情况下,正则表达式将只从这个例子中删除数字字符。

任何帮助表示赞赏。

Answer 1:

像这样的东西会为没有属性标签的工作:

\[(b|i|u)(:[a-z0-9]+)?\](.*?)\[\/\1(?:\2)?\]

\[               -- matches literal "[" 
  (b|i|u)        -- matches b, i, or u, captures as backreference 1
  (:[a-z0-9]+)?  -- matches colon and then alphanumeric string, captures as backreference 2
                 -- the question mark allows the :string not to be present.
\]               -- matches literal "]"
(.*?)            -- matches anything*, as few times as required to finish the match, creates backreference 3.
\[               -- matches literal "["
  \/             -- matches literal "/"
  \1             -- invokes backreference 1 to make sure the opening/closing tags match
  (?:\2)?        -- invokes backreference 2 to further make sure it's the same tag
\]               -- matches literal "]"

匹配像URL标签是很容易

与具有属性的标签,他们做不同的事情与他们的属性,所以它可能更容易从像IMG标签seperately处理像URL的标签。

\[(url)(?:\s*=\s*(.*?))?(:[a-z0-9]+)\](.*?)\[\/\1(?:\3)?\]

\[                    -- matches literal "["
  (url)               -- matches literal "url", in parentheses so we can invoke backreference 1 later, easier for you to modify
  (?:                 -- ?: signifies a non-capturing group, so it creates a group without creating a backreference, or altering the backreference count.
    \s*=\s*           -- matches literal "=", padded by any amount of whitespace on either side
    (.*?)             -- matches any character, as few times as possible, to complete the match, creates backreference 2
  )                   -- closes the noncapturing group
  (:[a-z0-9]+)        -- matches the alphanumeric string as backreference 3.
\]                    -- matches literal "]"
(.*?)                 -- matches any character as few times as possible to complete the match, backreference 4
\[                    -- matches literal "["
  \/                  -- matches literal "/"
  \1                  -- invokes backreference 1
  (?:\3)?             -- invokes backreference 3
\]                    -- matches literal "["

为了您的更换,标签的内容是反向引用自己,使你能为B / I / U标签做这样的事情。

<\1>\3</\1>

对于URL标记,它是这样的

<A href="\2">\4</A>

我说点/周期在多个地方的任何字符匹配。 它匹配除换行符任何字符。 您可以通过上交你的正则表达式换行符修改器"dotall"修饰符s这样

/(.*)<foo>/s


文章来源: phpbb BBCode to HTML (regex or otherwise)