初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2013-10-24 00:49:03

不特定URLを特定の文字列に置換

夜分遅く、すみません。
初めての投稿で、もし理解不能でしたら遠慮なく、
コメントください。

環境:
mac os x 10.8.4
FM 11

質問
テキストフィールドにある、不特定多数のURLを
特定の文字列に置換するのですが、うまくできなく、何か良い方がないか考えております。
ScriptMasterを使用しないでする方法を考えております。ご教示ください。

URL例)
http://fm..co.jp/1024/html
http://fm..co.jp/1024/jpg
http://fm..co.jp/1024/htm
http://fm..co.jp/1024/●●●●

基本、URLのスタートはhttpからで末尾の文字列や数は不特定多数です。
ファイルメーカーの関数でURLを判別し置換する関数はあるのでしょうか?
計算フィールドで試そうと思って試したのは下記です。

末尾がhtmlの場合、

Substitute ( URL置換フィールド ;
[ Middle ( URL置換フィールド ;
Position ( URL置換フィールド ; "http://" ; 1 ; 1 ) ;
Position (URL置換フィールド ; "html" ; Position ( URL置換フィールド ; "http://" ; 1 ; 1 ) ; 1 ) + 4 - Position ( URL置換フィールド ; "http://" ; 1 ; 1 ) ) ;
"URL置換できないです。" ]
)
↑ここまで
末尾htmlが1つの場合は置換はできましたが、文字列や数が不特定多数になると・・・

・・・な状態になってしまいました。。。
何か良い方法があれば、教えてください。
宜しくおねがいします。

Offline

#2 2013-10-24 05:26:17

Hiro
Member

Re: 不特定URLを特定の文字列に置換

URL文字列の区切り文字が、" "半角スペース か "  "全角スペース か "¶"改行 か ","カンマ かの4種類と仮定して、

「http://fm..co.jp/1024/html と
  http://fm..co.jp/1024/jpg
  http://fm..co.jp/1024/htm それと
  http://fm..co.jp/1024/●●●●」
   ↓
「URL置換できないです。 と
  URL置換できないです。
  URL置換できないです。それと
  URL置換できないです。」

を得る計算式は、(フィールド内のURLの数が大凡300件を超えないものとして)

Let([
 $res=URL置換フィールド;
 $fnc="Case(
  PatternCount($res;\"http://\")=0; $res;
  Let([
   $sp=Position($res;\"http://\";1;1);
   $ep=Min(Length($res)+1
      ;Case(Position($res;\" \";$sp;1)>0;Position($res;\" \";$sp;1))
      ;Case(Position($res;\" \";$sp;1)>0;Position($res;\" \";$sp;1))
      ;Case(Position($res;\"\¶\";$sp;1)>0;Position($res;\"\¶\";$sp;1))
      ;Case(Position($res;\",\";$sp;1)>0;Position($res;\",\";$sp;1))
     );
   $res=Substitute($res;[Middle($res;$sp;$ep-$sp);\"URL置換できないです。\"])
  ]; Evaluate($fnc))
 )"
];
 Evaluate($fnc)
)

Offline

#3 2013-10-25 21:51:17

wader
Member

Re: 不特定URLを特定の文字列に置換

末尾というのが拡張子のことを言ってるようでもある。ので、それを使うとしてこんな式も作れますが(開始と終了の対応がちゃんとしてないとだめ)
どっちにしても「不特定」では無理ですよね。何かしら多数でも「特定」でないと、計算式に指定しようがないので。

Let ( [
$repl = "URL置換できないです。"
];
Evaluate (
Substitute ( Quote ( text ) ; [ "http://" ; "\" & Left ( \"" ] ;
[ ".html" ; "\" ; 0 ) & $repl & \"" ] ;
[ ".htm" ; "\" ; 0 ) & $repl & \"" ] ;
[ ".jpeg" ; "\" ; 0 ) & $repl & \"" ] ;
[ ".jpg" ; "\" ; 0 ) & $repl & \"" ] )
)
)

Offline

#4 2013-10-26 08:51:32

wader
Member

Re: 不特定URLを特定の文字列に置換

URLというのは明確なんで、URLに使用される文字が続いてる部分を置換、でいいかな。

Let ( [
 $str = "http://";
 $len = Length ( $str );
 $repl = "URL置換できないです。";
 $text = text & Char(9);

 //URL使用文字の定義
 $lowalpha = "abcdefghijklmnopqrstuvwxyz";
 $hialpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 $alpha = $lowalpha & $hialpha;
 $digit = "0123456789";
 $safe = "$-_.+";
 $extra = "!*'(),";
 $hex = $digit & "ABCDEFabcdef";
 $escape = "%" & $hex;

 $unreserved = $alpha & $digit & $safe & $extra;
 $uchar = $unreserved & $escape;
 $http = "/?" & $uchar & ";:@&=";

 //関数定義
 //$strからURL使用文字でない文字の前までを$replで置換
 $f="Let($p=Position($text;$str;1;1);Case($p=0;$text;Let($text=Replace($text;$p;Let($i=$p+$len;Evaluate($g))-$p;$repl);Evaluate($f))))";
 //URL使用文字でない文字の位置を返すサブ関数
 $g="Case(Filter(Middle($text;$i;1);$http)=\"\";$i;Let($i=$i+1;Evaluate($g)))";
 //関数実行
 a=Evaluate ( $f )
];
 //$http&
 Left ( $text ; Length ( $text ) - 1 )
)

Offline

Registered users online in this topic: 0, guests: 1
[Bot] claudebot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.008 seconds, 7 queries executed - Memory usage: 513.03 KiB (Peak: 517.57 KiB) ]