Regex для автоматизации некоторых тегов HTML - PullRequest
1 голос
/ 14 июля 2010

У меня 800 записей, которые очень похожи, но им нужно кое-что сделать с ними.Формат такой:

<td class="description"><br> Describing text.<br> Might very well be 2 paragraphs<br> </td>

Мне нужно кое-что сделать с текстом внутри ячейки.Я пытался использовать preg_replace ('/(.+) /').Это заканчивается двумя проблемами.

  1. Мне не удается извлечь то, что находится внутри скобок, но он также извлекает теги ячеек.
  2. Он будет извлекать все до последнего </td> в документе.Я просто хочу, чтобы это пошло на первое вхождение </td>

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

Ответы [ 6 ]

1 голос
1 голос
/ 14 июля 2010

Прежде всего,. + Все схватит ... он не просто начнется с <td>. Вы захотите добавить регулярное выражение, чтобы вытянуть начало таблицы col:

<td[^>]*?>

(примечание, [^>]* означает совпадение не-> символов, пока мы не найдем его.)

Кроме того, .+ и .* являются жадными , что означает, что он будет захватывать как можно больше. Чтобы изменить это поведение, добавьте ? после него, например: .+?. Это заставляет его удовлетворять столько, сколько ему нужно.

Итак, у вас будет

<td[^>]*)>(.*?)<\/td>

Это был урок по регулярным выражениям, но я действительно думаю, что вы не должны использовать регулярные выражения для этого. Regex может легко сломаться, когда вы начнете иметь вложенные таблицы или что-нибудь более сложное, чем простой HTML.

0 голосов
/ 14 июля 2010
$d = new DOMDocument();
$d->loadHTML($htmlstring);
$x = new DOMXPath($d);
$tds = $x->query("//td[@class='description']//text()");
for($i = 1; $i <= $tds->length; $i++){
    $tds->item($i)->replaceData(0,mb_strlen($tds->item($i)->wholeText),strtoupper($tds->item($i)->wholeText));   
}
var_dump($d->saveHTML());
0 голосов
/ 14 июля 2010

Как сказали все остальные: RegExp плох, по крайней мере, здесь!

Итак, базовое регулярное выражение равно

#<td[^>]*>(.*?)</td>#s

(заметьте, я использовал s-модификатор, в противномRegExp не сработает.)

Теперь этот RegExp неверен, даже если он подходит для ваших целей.Чтобы быть более строгим, вы должны знать, что > допускается в атрибутах.Поэтому это регулярное выражение может сломать вещи.

#<td(\s+\w+="[^"]+")\s*>(.*?)</td>#s

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

0 голосов
/ 14 июля 2010

Вы можете использовать:

preg_replace(
  '/<td (.*?)>(.*?)<\/td>/sm',
  '<td class="description"><strong>$2</strong></td>',
  $data
)

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

0 голосов
/ 14 июля 2010

Если вы уверены, что в ячейках таблицы нет HTML, может помочь следующий код без регулярных выражений:

// $entries contains all of the table cell entries.
$newentries = "";
$cells = split("</td>",$entries);
while (list(,$data) = each($cells)) {
    $newentries .= "<td class=\"description\">";
    $text = substr($data,strpos($data, ">") + 1);
    // perform modifications on $text
    // i.e. $text = "<B>" . $text . "</B>";
    $newentries .= $text;
    $newentries .= "</td>";
}

// $newentries now contains the modified cell entries.

Возможно, это не на 100% то, что вы ищете,но, возможно, это поможет.

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