正则表达式。带有可选参数

时间:2013-09-27 01:02:10

标签: php regex preg-replace

我需要使用reg-exp来匹配某些文本,然后生成一个CTA按钮。我想要的是,以下文本将导致输出:

示例1

{BUTTON text="(some text)" link="(some link)" target="(target, OPTIONAL)" class="(classes, OPTIONAL)"}

<a href="(some link)" target="(target)" class="$4">(some text)</a>

示例2

{BUTTON text="(some text)" link="(some link)" target="(target, OPTIONAL)"}

<a href="(some link)" target="(target)">(some text)</a>

实施例3

{BUTTON text="(some text)" link="(some link)"}

<a href="(some link)">(some text)</a>

我自己的“解决方案”是这样的,但我不认为这是“正确”的方式 - 换句话说,我很确定,它有缺陷!

{BUTTON text="([a-zA-Z0-9 ]+)" link="([A-Za-z0-9\/\:\.\?\=]+)"( target=")?([a-zA-Z\_]+)?(")? ( class=")?([a-zA-Z\_]+)?(")?}

1 个答案:

答案 0 :(得分:0)

您需要对非替换中的部分使用非捕获组(或更改替换中的数字以考虑所有部分):

{BUTTON text="([a-zA-Z0-9 ]+)" link="([A-Za-z0-9\/\:\.\?\=]+)"\s*(target="[a-zA-Z\_]+")?\s*(class="[a-zA-Z\_]+")?}

替换字符串应为:

<a href="$2" $3 $4>$1</a>

请注意,我将整个target="..."class="..."元素组成了一个可选组,以便将它们全部替换为替换组。

以下是如何捕获类名称并将其与模板中的其他类合并的方法:

{BUTTON text="([a-zA-Z0-9 ]+)" link="([A-Za-z0-9\/\:\.\?\=]+)"\s*(target="[a-zA-Z\_]+")?\s*(?:class="([a-zA-Z\_]+)")?}

<a href="$2" $3 class="c1 c2 $4">$1</a>

这使用非捕获组来匹配整个class="..."元素,然后仅捕获...部分。