* セル内HTMLタグの除去について[#x18a3a84]
|RIGHT:|LEFT:|c
|~ページ|[[OpenOffice.org FAQの登録ページ]]|
|~投稿者|radiconkid|
|~分類|#listbox3(Q&A,faq03,class)|
|~優先順位|#listbox3(低,faq03,priority)|
|~状態|#listbox3(完了回答待ち,faq03,state)|
|~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
|~投稿日|2011-01-22 13:31:19 (土)|
|~OS|Windows XP|
|~依存するページ||
|~バージョン|#listbox3(3.2.1,faq03,version)|

** メッセージ [#rf857699]
|LEFT:|c
|回答ページでは行末に「~」を付加する必要はありません|
#contents

はじめて投稿します。

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

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

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

----
***関数と正規表現 [#e437883d]
>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))」で削除できましたが、万能ではないです。~

//
***検索と置換で一括削除 [#l3a0f5ed]
>M.Kamataki (2011-01-22 23:56:59 (土))~
~
最短一致と最長一致~
http://php-web.net/regular/matching.html~
~
こちらのページを参考に「検索と置換」で「正規表現」をチェックして、「検索テキスト」に「<[^>]*>」を指定すると一括削除できました。~

//
***正規表現対応のSUBSTITUTE関数 [#o2e01a2b]
>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~

//
***ありがとう御座います。 [#l0f67aa4]
>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

//
***ユーザー定義関数でしょうか [#m9c4f366]
>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))

//
***最初の正規表現例について [#n09b48d6]
>M.Kamataki (2011-01-24 23:07:16 (月))~
~
「<("[^"]*"|\'[^\']*\'|[^\'">])*>」は、以下のページで紹介されているものですね。ただし、「'」を「\」でエスケープしていません。~
~
http://hodade.adam.ne.jp/seiki/page.php?r_tag_sakujo~
~
この正規表現もCalcで使えました。「[&color(red){^};'"&color(red){>};]」の部分には「[&color(red){^>};]」も含まれていますから、ike@九州さんのサンプルですと、正規表現の指定部分は以下のように変更できます。~
 aOptions.searchString = "<(""[^""]*""|'[^']*'|[^'"">])*>"
このようにマクロでは、「"」を「"」でエスケープする必要があります。逆に「'」は「\」でエスケープする必要はありません。~
~
同様に正規表現を利用できるSEARCH関数では、以下のように指定できました。~
 =SEARCH("<(""[^""]*""|'[^']*'|[^'"">])*>";A1)
やはり、「"」を「"」でエスケープする必要があるようです。~
~
この正規表現を使うと確かに「<input type="button" value=" next > ">」なタグでもOKでした。~

//
#article