Какой шаблон регулярного выражения мне нужен?

Мне нужно регулярное выражение (для работы на 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> 

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

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

Related of "Какой шаблон регулярного выражения мне нужен?"

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); 

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