「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:3950
現在:3


セル内HTMLタグの除去について

ページOpenOffice.org FAQの登録ページ
投稿者radiconkid
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-01-22 13:31:19 (土)
OSWindows XP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

はじめて投稿します。

calcでセル内のHTMLを除去するために、SUBSTITUTEの正規表現置換で置き換えたいと考えています。 検索文字列を「<("[^"]*"|\'[^\']*\'|[^\'">])*>」とすると「エラー:508」が帰ってきてしまいます。

正しい表記を教えて頂けませんでしょうか。

宜しくお願いいたします。


関数と正規表現

M.Kamataki (2011-01-22 23:31:15 (土))

Calcのすべての関数が正規表現に対応しているわけではないようです。

3.2.1のCalcを起動し、F1キーを押すとオンラインヘルプが表示できます。ヘルプの「正規表現のリスト」のページの下の方に「Calcの正規表現についてのWikiページ」というリンクがあり、クリックすると以下のページが表示されます。

http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Regular_Expressions_in_Calc

このページでは、「Regular expressions in Calc functions」の項に「正規表現が使える関数」が紹介されており、その中に「SUBSTITUTE」は残念ながら含まれていません。

また、正規表現は基本的には最長一致です。Calcの「検索と置換」で試すと、「<CENTER>中央揃え</CENTER>」のような文字列は、「<.*>」の正規表現でマッチさせると、文字列すべてが削除されちゃいます。この場合は、先に「</.*>」で削除して、次に「<.*>」で削除できますが、タグの出現は何パターンもあるのでけっこう難しいですね。

Excelでは以下のようなページがありました。

エクセルの関数でhtmlの削除は可能ですか?
http://oshiete.goo.ne.jp/qa/4176128.html

「<CENTER>中央揃え</CENTER>」のような文字列は、Calcでも「=TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1;">";"<");"<";REPT(" ";100));202;100))」で削除できましたが、万能ではないです。

検索と置換で一括削除

M.Kamataki (2011-01-22 23:56:59 (土))

最短一致と最長一致
http://php-web.net/regular/matching.html

こちらのページを参考に「検索と置換」で「正規表現」をチェックして、「検索テキスト」に「<[^>]*>」を指定すると一括削除できました。

正規表現対応のSUBSTITUTE関数

M.Kamataki (2011-01-23 00:06:51 (日))

OpenOffice.orgの不具合・要望データベースであるIssueTrackerに、正規表現対応のSUBSTITUTE関数を望む要望が上がっていました。以下です。

support regular expressions (regexps) in SUBSTITUTE function
http://ja.openoffice.org/issues/show_bug.cgi?id=106099

ありがとう御座います。

radiconkid (2011-01-24 10:32:39 (月))

皆様ありがとう御座います。
投稿後どうやら正規表現に対応していないということをこちらでも確認しておりました。
セル毎にタグの有る無しを自動で切り替えたかったのですが、今のところ難しいですかね。

マクロでどうにかしようとも思っているのですが、下記の内容でエラーが出てしまいます。

「BASICランタイムエラー
次のプロパティーまたはメソッドが見つかりません。createReplaceDescriptor」

まだまだ分からないことだらけでお力をお借りできれば嬉しいです。
宜しくお願いいたします。

	Function stripTag(str As String) As String
		Dim oDoc As Object
		Dim oReplaceDes As Object
		
		oDoc = ThisComponent
		oReplaceDesc = oDoc.createReplaceDescriptor()
		With oReplaceDesc
		.SearchString = "<[^>]*>"
		.ReplaceString = ""
		End With
		
		oDoc.replaceAll(oReplaceDesc)
	End Function

ユーザー定義関数でしょうか

ike@九州 (2011-01-24 15:38:48 (月))

>マクロでどうにかしようとも思っているのですが

マクロを拝見した限り
ユーザー定義関数で処理したい事のようですね

Function striptag(sText as string) As string
 oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
 aOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
 aOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
 aOptions.searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED
 aOptions.searchString = "<[^>]*>"
 oTextSearch.setOptions(aOptions)
 Do while oTextSearch.searchForward(sText,0,Len(sText) -1).subRegExpressions
  aResult = oTextSearch.searchForward(sText,0,Len(sText) -1)
  sText = Left(sText,aResult.startOffset(0)) &_
  Right(sText,Len(sText)-aResult.endOffset(0))
 Loop
 striptag = sText
End Function

セルに何も入っていない場合、引数が 0 になるようなので
以下が宜しいかも知れません

=IF(A1 = "";"";STRIPTAG(A1))

最初の正規表現例について

M.Kamataki (2011-01-24 23:07:16 (月))

「<("[^"]*"|\'[^\']*\'|[^\'">])*>」は、以下のページで紹介されているものですね。ただし、「'」を「\」でエスケープしていません。

http://hodade.adam.ne.jp/seiki/page.php?r_tag_sakujo

この正規表現もCalcで使えました。「[^'">]」の部分には「[^>]」も含まれていますから、ike@九州さんのサンプルですと、正規表現の指定部分は以下のように変更できます。

aOptions.searchString = "<(""[^""]*""|'[^']*'|[^'"">])*>"

このようにマクロでは、「"」を「"」でエスケープする必要があります。逆に「'」は「\」でエスケープする必要はありません。

同様に正規表現を利用できるSEARCH関数では、以下のように指定できました。

=SEARCH("<(""[^""]*""|'[^']*'|[^'"">])*>";A1)

やはり、「"」を「"」でエスケープする必要があるようです。

この正規表現を使うと確かに「<input type="button" value=" next > ">」なタグでもOKでした。

お名前:
題名: