我有800个非常相似的条目,但是他们需要做一些事情。 格式如下:
<td class="description">
Describing text.
Might very well be 2 paragraphs
</td>
我需要对单元格内的文本做一些操作。 我试过使用preg_replace('/(。+)&lt; / td&gt; /')。最终会出现两个问题。
</td>
。我只是想
它要去第一次出现
</td>
提前致谢
答案 0 :(得分:1)
首先,。+将抓住所有内容......它不会只是从<td>
开始。您需要添加一个正则表达式以拉出表格col的开头:
<td[^>]*?>
(注意,[^>]*
表示匹配非>
个字符,直到找到一个。)
此外,.+
和.*
贪婪,这意味着它会尽可能多地抓取。要更改此行为,请在其后添加?
,如下所示:.+?
。这使得它只满足它所需的数量。
所以,你会有
<td[^>]*)>(.*?)<\/td>
这是关于正则表达式的一课,但我认为你不应该使用正则表达式。一旦你开始使用嵌套表或比简单的html更复杂的东西,正则表达式可以很容易地破解。
答案 1 :(得分:1)
如果您仍想尝试...请使用非捕获组(?:)
排除标记,并使用延迟量词*?
以仅匹配第一个结束标记。
(?:<td[^>]*>).*?(?:</td>)
这需要全部点模式,如果例如说明属性包含一个结束尖括号,则可能仍会失败。
答案 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());