Мне нужно регулярное выражение (для работы на 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>
[следует заменить метры на слово, но не на имя]
Я знаю, что есть крайние случаи, когда замена не была бы полезна (если его зовут Тони Метр, например), но они достаточно редки, что мы можем справиться с ними, когда они придут.
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();
Я думаю, вам нужен словарь и, возможно, даже какой-то грамматический анализ, чтобы заставить его работать правильно, так как у вас нет контроля над вводом. Чистое решение регулярных выражений на самом деле не сможет правильно обрабатывать такие данные.
Поэтому я бы предложил сначала придумать список слов, которые нужно заменить, это не только «цвет» и «метр». Википедия имеет некоторую информацию по этой теме .
Вы не хотите для этого регулярного выражения. Регулярные выражения по своей природе являются безстоящими, и вам нужно какое-то определенное состояние, чтобы иметь возможность сказать разницу между «в html-теге» и «в данных».
Вы хотите использовать парсер HTML в сочетании с чем-то вроде str_replace или даже лучше использовать правильный грамматический словарь и прочее, как предлагает Лусеро.
Вторая проблема проще – вы хотите заменить, когда есть слова вокруг слова: http://www.regular-expressions.info/wordboundaries.html – это позволит вам не заменять счетчик в Brammeter.
Первая проблема намного сложнее. Вы не хотите заменять слова внутри объектов HTML – ничего между символами <>. Итак, ваш матч должен убедиться, что вы последний раз видели> или ничего, но не просто <. Это либо сложно, либо требует некоторой комбинации утверждений lookahead / lookbehind или просто невозможно с регулярными выражениями.
скрипт, реализующий машину состояний, будет работать намного лучше здесь.
Вам не нужно явно использовать регулярное выражение. Вы можете попробовать функцию str_replace , или если вам нужно, чтобы она была нечувствительна к регистру, используйте функцию str_ireplace .
Пример:
$str = "<p>Color: red</p>"; $new_str = str_ireplace ('%color%', 'colour', $str);
Вы можете передать массив со всеми словами, которые вы хотите найти, вместо строки.