4

コメントや他のユーザーが送信したコンテンツの基本的な文法をプログラムでクリーンアップしています。I、文の最初の文字などを大文字にします。ユーザーがテキストをフォーマットする際にいくつかのオプションがあるため、コメントとコンテンツはHTMLと混合されます。

これは、特にPHPや正規表現を初めて使用する人にとっては、予想よりも少し難しいことを実際に証明しています。

文を大文字にするのに役立つhtmlを無視するucfirstのような関数がある場合はどうなりますか?

また、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()は、スキャンごとに一度に1つの小さなクリーンアップを実行するために使用していた多くの関数の1つにすぎません。フィルタを介してテキストを100回実行する必要があったとしても、サイトにトラフィックがない場合、これはcron実行で実行されます。アプローチを継続する上でいくつかの素晴らしいアイデアがあることは明らかなので、これを継続できるディスカッションフォーラムがあればいいのにと思います。プロジェクト全体としてこれにどのように取り組むかについての考えは、ぜひコメントを残してください。

質問自体の精神で推測します。ucfirstは、無視するものの引数リストを取ることができなかったため、これに最適な関数ではありません。フラグIGNORE_HTMLは素晴らしいでしょう!

これがPHPの質問であるとすると、以下で推奨されるDOMパーサーが最良の答えのように聞こえますか?考え?

4

4 に答える 4

4

次のように、CSS疑似要素を目的の要素に追加することもできます。

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

しかし、CSSには単一のタグ内の新しい文の開始を検出する機能がないため、おそらく方法を変更する必要があります。センテスを印刷します(すべてを1つの巨大なタグに印刷する場合):(

于 2012-10-24T09:20:53.683 に答える
1

おそらくDOMパーサーを使用する必要があります(組み込みのパーサー、またはたとえばこれは非常に使いやすいものです)。

preg_replace_callbackHTML内のすべてのテキストノードをウォークスルーし、、およびucfirst次のような正規表現を使用してクリーンアップを実行します。

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

これは空白の文字列と一致し、次にできるだけ多くの非文末句読文字と一致します。実際の文(文が。で始まっていない限り、文字で始まり"、少し複雑になります)は、最初のキャプチャグループに表示されます。

しかし、あなたの質問から、あなたはすでに後者のようなことをしていて、あなたのコードはHTMLタグを窒息させているだけだと思います。リンクした2番目の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に変換する前に、データベースから引き出した時点でテキストをクリーンアップすることです。または、データベースを1回クリーンアップすることをお勧めします。

于 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 に答える