正则表达式自动化一些HTML标记

时间:2010-07-14 13:47:29

标签: php regex

我有800个非常相似的条目,但是他们需要做一些事情。 格式如下:

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

我需要对单元格内的文本做一些操作。 我试过使用preg_replace('/(。+)&lt; / td&gt; /')。最终会出现两个问题。

  1. 我无法取得什么 在括号内,但它会 还可以获取单元格标签。
  2. 它将获取所有内容,直到最后一次 文档中的</td>。我只是想 它要去第一次出现 </td>
  3. 提前致谢

6 个答案:

答案 0 :(得分:1)

首先,。+将抓住所有内容......它不会只是从<td>开始。您需要添加一个正则表达式以拉出表格col的开头:

<td[^>]*?>

(注意,[^>]*表示匹配非>个字符,直到找到一个。)

此外,.+.* 贪婪,这意味着它会尽可能多地抓取。要更改此行为,请在其后添加?,如下所示:.+?。这使得它只满足它所需的数量。

所以,你会有

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

这是关于正则表达式的一课,但我认为你不应该使用正则表达式。一旦你开始使用嵌套表或比简单的html更复杂的东西,正则表达式可以很容易地破解。

答案 1 :(得分:1)

答案 2 :(得分:0)

如果您确定表格单元格中没有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%,但也许它会有所帮助。

答案 3 :(得分:0)

您可以使用:

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

如果您尝试对内部文本执行的操作很复杂,请使用回调函数。

答案 4 :(得分:0)

正如所有其他人所说:RegExp很糟糕,至少在这里!

所以,基本的Regex是

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

(注意我使用了s-Modifier,否则RegExp将不起作用。)

现在,这个RegExp是错误的,即使它可能适合您的目的。更严格的是,您必须知道,属性中允许>。因此,这个正则表达式可能会破坏事物。

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

我认为如果你正在处理XML,现在这将是非常安全的。但可以肯定的是,它可能会在极少数情况下破裂,我现在无法想到这一点。

答案 5 :(得分:0)

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