Какой шаблон регулярных выражений мне нужен для этого? - PullRequest
0 голосов
/ 06 октября 2009

Мне нужно регулярное выражение (для работы в PHP), чтобы заменить американские английские слова в HTML британскими английскими словами. Таким образом, цвет будет заменен на цвет, метры на метры и т. Д. [Я знаю, что метры также являются британским английским словом, но для копии, которую мы будем использовать, она всегда будет относиться к единицам расстояния, а не к измерительным приборам]. Шаблон должен работать точно в следующих (слегка надуманных) примерах (хотя, поскольку я не контролирую фактические данные, они могут существовать):

<span style="color:red">This is the color red</span>

[не должен заменять цвет в теге HTML, но должен заменять его в предложении]

<p>Color: red</p>

[должно заменить слово]

<p>Tony Brammeter lives 2000 meters from his sister</p>

[должен заменить метры для слова, но не в названии]

Я знаю, что есть крайние случаи, когда замена была бы бесполезной (например, если бы его звали Тони Метер), но они достаточно редки, чтобы мы могли разобраться с ними, когда они появятся.

Ответы [ 5 ]

5 голосов
/ 06 октября 2009

Html / xml не следует обрабатывать с помощью регулярных выражений, действительно трудно сгенерировать, которое будет соответствовать чему-либо . Но вы можете использовать встроенное расширение dom и рекурсивно обрабатывать вашу строку:

# Warning: untested code!
function process($node, $replaceRules) {
    foreach ($node->children as $childNode) {
        if ($childNode instanceof DOMTextNode) {
            $text = pre_replace(
                array_keys(replaceRules),
                array_values($replaceRules),
                $childNode->wholeText
            );
            $node->replaceChild($childNode, new DOMTextNode($text));
        } else {
            process($childNode, $replaceRules);
        }
    }
}
$replaceRules = array(
    '/\bcolor\b/i' => 'colour',
    '/\bmeter\b/i' => 'metre',
);
$doc = new DOMDocument();
$doc->loadHtml($htmlString);
process($doc, $replaceRules);
$htmlString = $doc->saveHTML();
4 голосов
/ 06 октября 2009

Я думаю, что для правильной работы вам, скорее всего, понадобится словарь и даже некоторый грамматический анализ, поскольку вы не можете контролировать ввод. Чистое решение регулярных выражений не сможет правильно обработать данные такого типа.

Так что я бы предложил сначала придумать список слов, которые нужно заменить, это не только «цвет» и «метр». В Википедии есть информация по теме .

1 голос
/ 06 октября 2009

Вторая проблема проще - вы хотите заменить, если вокруг слова есть границы слов: http://www.regular -expressions.info / wordboundaries.html - это гарантирует, что вы не замените метр в Брамметре.

Первая проблема гораздо сложнее. Вы не хотите заменять слова внутри сущностей HTML - ничего между символами <>. Таким образом, ваш матч должен убедиться, что вы в последний раз видели> или ничего, но не просто <. Это либо сложно, и требует некоторой комбинации <a href="http://www.regular-expressions.info/lookaround.html" rel="nofollow noreferrer"> lookahead / lookbehind утверждений , либо просто невозможно с регулярными выражениями.

скрипт, реализующий конечный автомат, будет работать здесь намного лучше.

1 голос
/ 06 октября 2009

Вам не нужно регулярное выражение для этого. Регулярные выражения по своей природе не имеют состояния, и вам нужна некоторая мера состояния, чтобы можно было различить «в HTML-теге» и «в данных».

Вы хотите использовать анализатор HTML в сочетании с чем-то вроде str_replace или, что еще лучше, использовать правильный словарь грамматики и прочее, как рекомендует Лусеро.

0 голосов
/ 06 октября 2009

Вам не нужно явно использовать регулярное выражение. Вы можете попробовать функцию str_replace или, если вам нужно, чтобы она не учитывала регистр, используйте функцию str_ireplace .

Пример:

$str = "<p>Color: red</p>";
$new_str = str_ireplace ('%color%', 'colour', $str);

Вы можете передать массив со всеми словами, которые вы хотите найти, вместо строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...