4

我正在以编程方式清理评论和其他用户提交的内容中的一些基本语法。大写 I、句子的第一个字母等。评论和内容与 HTML 混合在一起,因为用户在格式化文本时有一些选项。

事实证明,这比预期的更具挑战性,尤其是对于 PHP 和 regex 的新手而言。

如果有像 ucfirst 这样的函数会忽略 html 以帮助大写句子?

此外,任何有关在 html 中清理此类文本的链接或教程将不胜感激。请在评论中留下您认为有帮助的任何内容。谢谢!

编辑:示例文本:

<div><p>i wuz walkin thru the PaRK and found <strong>ur dog</strong>. <br />i hoPe to get a reward.<br /> plz call or text 7zero4 8two8 49 sevenseven</div>

我需要它(最终)

<div><p>I was walking through the park and found <strong>your dog<strong>. <p>I hope to get a reward.</p><p> Please call or text (704) 828-4977.</p>

我知道这比预期的问题要远一些,但我的想法是逐步做到这一点。ucfirst() 只是我用来在每次扫描时进行一次小清理的众多函数之一。即使我必须通过过滤器运行文本 100 次,当站点没有流量时,它也会在 cron 运行中运行。我希望有一个讨论论坛可以继续下去,因为显然会有一些关于继续这种方法的好主意。关于如何通过各种方式将其作为一个整体项目来处理的任何想法,请发表评论。

我想本着问题本身的精神。那么 ucfirst 将不是最好的函数,因为它不能接受要忽略的事物的参数列表。一个标志 IGNORE_HTML 会很棒!

鉴于这是一个 PHP 问题,那么下面推荐的 DOM 解析器听起来是最好的答案吗?想法?

4

4 回答 4

4

您还可以将 CSS 伪元素添加到所需的元素,如下所示:

div:first-letter {
    text-transform: uppercase;
}

但是您可能需要改变方式,打印出您的句子(如果您将它们全部打印在一个巨大的标签中),因为 CSS 缺乏检测单个标签内新句子开始的能力:(

于 2012-10-24T09:20:53.683 回答
1

您可能应该使用 DOM 解析器(内置的解析器或例如这个非常易于使用的解析器)。

preg_replace_callback遍历 HTML 中的所有文本节点并使用和ucfirst像这样的正则表达式执行清理:

'/(\s*)([^.?!]*)/'

这将匹配一串空格,然后匹配尽可能多的非句尾标点符号。"然后将在第一个捕获组中找到实际的句子(以字母开头,除非您的句子以 开头,这会使事情变得有点复杂)。

但是从您的问题来看,我想您已经在做类似后者的事情,而您的代码只是在 HTML 标记上窒息。这是一些示例代码,用于使用我链接的第二个 DOM 解析器获取所有文本节点:

require 'simple_html_dom.php';

$html = new simple_html_dom();
$html->load($fullHtmlStr);

foreach($html->find('text') as $textNode)
    $textNode = cleanupFunction($textNode);

$cleanedHtmlStr = $html->save();
于 2012-10-24T09:30:50.953 回答
0

在 html 中这将非常困难,因为您将构建某种 html 解析器。我的建议是在将文本转换为 html 之前清理文本,此时您将其从数据库中拉出。或者更好的是,清理一次数据库。

于 2012-10-24T09:25:09.540 回答
0

这应该这样做:

function html_ucfirst($s) {
    return preg_replace_callback('#^((<(.+?)>)*)(.*?)$#', function ($c) {
            return $c[1].ucfirst(array_pop($c));
    }, $s);
}

转换

  • <b>foo</b><b>Foo</b>,
  • <div><p>test</p></div><div><p>Test</p></div>,
  • 还要。bar_Bar

编辑:根据您的详细问题,您可能希望将此功能应用于每个句子。您必须先解析文本(例如按句点分割)。

于 2013-04-13T18:58:51.143 回答