Регулярное выражение: изменяет значение атрибутов HTML для некоторого шаблона - PullRequest
1 голос
/ 15 мая 2010

У меня есть тысячи HTML-тегов, я написал так:
<input type="text" name="CustomerName" />
<input type="text" name="SalesOrder"/>

Мне нужно сопоставить значения каждого атрибута name и преобразовать их все так, чтобы это было так:
CustomerName -> cust[customer_name]
SalesOrder -> cust[sales_order]

Таким образом, результаты будут:
<input type="text" name="cust[customer_name]" />
<input type="text" name="cust[sales_order]" />

Моя лучшая попытка застряла в этой схеме: name=\"[a-zA-Z0-9]*\"
-> только что найдено name="CustomerName"

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

Разбор HTML не является хорошим использованием RegEx. Пожалуйста, смотрите здесь .

С учетом вышесказанного, это может быть достаточно маленькой задачей, которая не сведет вас с ума. Вам нужно что-то вроде:

Найти: name="(.+)"

Заменить: name="cust[$1]"

и затем надеемся, что ваш HTML не очень нерегулярен (большинство есть, но вы всегда можете надеяться).

Обновление: вот некоторые sed -fu , чтобы начать работу с camelCase -> подчеркивания.

0 голосов
/ 15 мая 2010

Как-то так?

<code><?php
$subject = <<<EOT
<input type="text" name="CustomerName" />
<input type="text" name="SalesOrder"/>
EOT;
$pattern = '/\\bname=["\']([A-Za-z0-9]+)["\']/';
$output = preg_replace_callback($pattern, function ($match) {
    return ''
    . 'name="cust['
    . strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $match[1]))
    . ']"';
}, $subject);
?>
<pre><?php echo htmlentities($output);?>

Вывод выглядит так:

<input type="text" name="cust[customer_name]" />
<input type="text" name="cust[sales_order]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...