使用preg_replace将内容替换为HTML

时间:2017-06-27 10:32:38

标签: php

我想替换以下代码:

[text required id="address_line_1" label="Address Line 1"]
[text required id="city" label="City"]

有了这个:

<label for="address_line_1">Address Line 1 (required)</label>
<input type="text" name="address_line_1" />

<label for="city">City (required)</label>
<input type="text" name="city" />

我认为preg_replace是最好的选择吗?但是我不知道如何做到这一点,因为我想要替换的内容都是混合的,它不仅仅是用Y字符串简单替换X.

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

你可以这样使用preg_match(这适用于你的两种情况),但你需要分别为你的例子的每一行做这些:

<?php

function transformToHTML($input) {
    $regex = '/\[(text)\s+(required)?\s+id="(.*)?"\s+label="(.*)"\s*\]/i';

    $replaced = $input; // default, when there's no match

    if (preg_match($regex, $input, $matches)) {
       $inputType = $matches[1];
       $id = $matches[3];
       $required = $matches[2];
        $label = trim($matches[4] . ' ' . ($required ? "({$required})" : ''));
       $replaced = '<label for="' . $id . '">' . $label . '</label>
          <input type="' . $inputType . '" name="' . $id . '" />';
    }
    return $replaced;
}

$input = '[text required id="address_line_1" label="Address Line 1"]';
$output = transformToHTML($input);

echo "INPUT: {$input}<br>";
// remove "htmlentities()" call to get raw html string
// here it's just for printing HTML string into HTML ;)
echo "OUTPUT: " . htmlentities($output);

它打印(在PHPFiddle上测试):

INPUT: [text required id="address_line_1" label="Address Line 1"]
OUTPUT: <label for="address_line_1">Address Line 1 (required)</label> <input type="text" name="address_line_1" />

当然这对您的情况有效,如果您有一些额外的输入类型或更多规则,您可能需要更多地调整它。仍然 - 使用正则表达式,一切皆有可能:)

答案 1 :(得分:0)

我要做的是explode内容,并按照我的意愿使用它。我知道你问了一个正则表达式,但是每个答案都在这里,所以我没有这样做,有时它更清晰:

function mountHtml($text = '[text required id="address_line_1" label="Address Line 1"]')
{
    $text = str_replace(['[', ']'],'',$text);
    $items = explode(' ', $text);
    $items[3] = str_replace(['label="', '"'], '', implode(' ', array_slice($items, 3)));
    $items = array_splice($items, 0, 4);
    $label = [
        str_replace('id', 'for', $items[2]),
        $items[3]
    ];
    $input = [
        $items[0],
        str_replace('id', 'name', $items[2]),
        $items[2]
    ];
    $htmlStructure = "<label $label[0]>$label[1] ($items[1])</label>";
    $htmlStructure .= "<input type='$input[0]' $input[1] $input[2] />";
    return $htmlStructure;
}
echo mountHtml();
//Result
<label for="address_line_1">Address Line 1 (required)</label><input type="text" name="address_line_1" id="address_line_1">

PS:我发现你没有在输入结构中添加id,但是对于better DOM management来说这很重要,因为每个带有for的标签都链接到一个带有ID的结构,它是W3C标准。

  

for = string   指定用于指示与标题关联的表单控件。   属性的值必须是与标签元素在同一Document中的可标记的与表单相关的元素的ID。

https://www.w3.org/wiki/HTML/Elements/label