2017-06-27 82 views
0

我想替換下面的代碼內容:使用的preg_replace來替換HTML

[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_replace函數]返回字符串(http://php.net/manual/de /function.preg-replace.php)與[命名捕獲組](http://www.regular-expressions.info/named.html)。爲了測試/開發目的,請嘗試[regex101](https://regex101.com/)。 – Xatenev

+0

當我不得不這樣做來創建簡單的短代碼系統時,我傾向於分解所有參數並在循環中處理它們。這將使我更具可讀性,減少頭部擠壓。但是,如果你想驗證你的參數值,則正則表達式將是合適的。順便說一下,不要說正則表達式不適合,但我不會爲你寫:D – Kaddath

回答

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" /> 

當然這對你的情況有效,如果你有一些額外的輸入類型或更多的規則,你可能需要更多地調整它。仍然 - 擺弄正則表達式,一切皆有可能:)

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 =字符串 指定用於指示要與標題關聯的表單控件。 屬性的值必須是與label元素相同的Document中的可鏈接表單關聯元素的ID。

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