У меня есть 800 записей, которые очень похожи, но им нужен некоторый материал, сделанный им. Формат похож на это:
<td class="description">
Describing text.
Might very well be 2 paragraphs
</td>
Я должен сделать некоторый материал к тексту в ячейке. Я попытался использовать preg_replace (' / (. +) </td> / '). Это заканчивается с двумя проблемами.
</td>
в документе. Я просто хочу, чтобы это перешло к первому вхождению </td>
Заранее спасибо
Прежде всего,. + Захватит все ... он не будет начинаться только с (примечание, Кроме того, Итак, у вас будет Это был урок по регулярным выражениям, но я действительно думаю, что вам не следует использовать для этого регулярные выражения. Regex может довольно легко сломаться, если у вас появятся вложенные таблицы или что-то более сложное, чем простой html. Если вы все еще хотите попробовать... используйте группы без захвата Это требует режима dot-all и может не сработать, если, например, атрибут description содержит закрывающую угловую скобку. Если вы уверены, что в ячейках таблицы нет HTML, следующий код без регулярных выражений может помочь: Вероятно, это не на 100% то, что вы ищете, но, возможно, это поможет. Как уже сказали все остальные: RegExp - это плохо, по крайней мере здесь! Итак, базовый Regex это (Обратите внимание, я использовал s-модификатор, иначе RegExp не работал бы.) Итак, этот RegExp неправильный, хотя он может быть подходящим для ваших целей. Чтобы быть более строгим, вы должны знать, что Я думаю, что теперь это будет вполне безопасно, если вы имеете дело с XML. Но, конечно, он может сломаться в редких случаях, о которых я сейчас не могу вспомнить. Вы можете использовать: Если то, что вы пытаетесь сделать с текстом внутри, усложняйте, используйте функцию обратного вызова.
. Вам нужно будет добавить регулярное выражение для извлечения начала таблицы col:
<td[^>]*?>
[^>] *
означает совпадение не- >
символов, пока мы не найдем его. ) . +
и . *
являются жадными , что означает, что он захватит как можно больше. Чтобы изменить это поведение, добавьте после него ?
, например: . +?
. Это позволяет ему удовлетворять ровно столько, сколько нужно. <td[^>]*)>(.*?)<\/td>
(?:)
для исключения тегов и ленивый квантификатор *?
для соответствия только до первого закрывающего тега. (?:<td[^>]*>).*?(?:</td>)
// $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.
#<td[^>]*>(.*?)</td>#s
>
разрешено в атрибутах. Поэтому этот регекс может все сломать. #<td(\s+\w+="[^"]+")\s*>(.*?)</td>#s
$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());
preg_replace(
'/<td (.*?)>(.*?)<\/td>/sm',
'<td class="description"><strong>$2</strong></td>',
$data
)
Похожие вопросы: