我想替换以下代码:
[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.
感谢任何帮助!
答案 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。