[Flutter] 메시지의 URL 식별
현재 어느 시동에서 매일 Flutter와Firebase를 이용해 휴대전화 앱을 개발하고 있다.
이번 보도의 내용은 채팅 기능을 실현할 때
· 메시지에 URL을 포함할 때의 링크 식별
· 특히 여러 URL이 포함된 경우 설치
(나 혼자 고민이야.)
그래서 이번에는 제 힘으로 실시를 했습니다. 관련 실시방안을 공개했습니다. 유식한 분들이 보실 수 있다면 말씀해 주시기 바랍니다. 그래서 투고했습니다.
실제로 더 많은 실현이 있을지 모르겠지만 알고리즘의 실현에 대해 자신 있습니다. 참고할 수 있다면 좋겠습니다.
반대로 아는 사람 있으면 연락 주시면 좋겠어요.
URL이 포함된 문자열 분할
예를 들어, URL을 포함하는 문자열에는 다양한 패턴이 존재한다고 생각합니다.
이런 예들 중에서 나도 아래의 예를 고려할 것이다.
例)
final List<String> exampleMessages =
[
'①https://yahoo.co.jp',
'②ここから検索できるよ! https://google.co.jp',
'③意見をhttps://twitter.comで見れるから、https://google.co.jpで検索してね!'
];
이렇게 ①, ②, ③를 고려할 때 아래로 갈수록 실현하기 어렵다.간단하게 분류하면...
① URL 직접 가입
② 문자열과 URL 혼합
③ 문자열과 URL 혼합
이런 패턴으로 분류할 수 있다.
이때 ③로 분할을 잘 할 수 있다면 ①와 ② 같은 패턴도 분할할 수 있다. 이번 실상이다. 지금부터 설명한다.
분할 구현
실제로, 나는 이것이 Flutter와dart 이외의 언어로 실현될 수 있다고 생각하지만, 나는 문자열의 분할 작업을 고려할 것이다.
상기 ③를 예로 들어 생각하다.
우선 이 작업의 실시로서 목표는
Stringの文字列をList<String>として分割した配列にしていくこと
이다.의견을 발표하다https://twitter.com보실 수 있습니다, https://google.co.jp검색해보세요.!"
=>[",",",", "에서 의견을 볼 수 있습니다."https://google.co.jp","에서 검색하세요!"
이렇게 됐으면 좋겠다.
이런 방법을 생각해보면 된다는 얘기다.
// 分割するメソッド
List<String> getSplittedMessage(String message){
};
그럼 이쪽 방법을 매립하고 싶어요.① 정보에서 URL 추출
우선, 이 메시지에서 URL을 추출하여 하나의 배열로 만듭니다.
인상
’意見をhttps://twitter.comで見れるから、https://google.co.jpで検索してね!'
=> ['https://twitter.com', 'https://google.co.jp' ]
의 바람이 됐으면 좋겠어요.이곳에 관한 보도는 제가 이곳을 참고하도록 해 주세요.Flutter를 사용하여 텍스트의 URL을 검사하는 방법
우선, URL 등의 판정에 사용되는 클래스 RegExp 클래스를 사용하여 URL 추출 방법을 씁니다.
List<String> getSplittedMessage(String message){
// RegExpを定義
final RegExp urlRegExp = RegExp(
r'((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?');
// ここで、Iterable型でURLの配列を取得
final Iterable<RegExpMatch> urlMatches =
urlRegExp.allMatches(message);
};
이렇게 되면 urlMatches
라는 Iterable형 배열이 형성된다.여기서 아까 예시대로
urlMatches = ['https://twitter.com', 'https://google.co.jp']
형식으로 대입하면 URL 추출 자체가 이때 완성된다.② 버스트 정보
여기서부터 알고리즘적인 작업을 진행한다.
최초 대입
message
과 아까urlMatches
를 사용하여 분할한다.이것에 관해서는 코드를 직접 싣는 것도 이해하기 어려우니 먼저 분할의 순서를 설명하자.
元の文章
'意見をhttps://twitter.comで見れるから、https://google.co.jpで検索してね!'
①空の配列と、文字列を用意
List<String> splittedMessage = <String>[];
String textEnd = "";
② 1つ目のURL(twitter)で、messageを分割(かならず2つに分かれる)
['意見を', 'で見れるから、https://google.co.jpで検索してね!']
③ ②の配列で、twitterのURLまでの文章とURLを、splittedMessageに入れる
splittedMessage = ['意見を', 'https://twitter.com'];
④ ②の配列で、残ったメッセージをtextEndに代入
textEnd = 'で見れるから、https://google.co.jpで検索してね!';
⑤ 2つめのURL(google)で、textEndを分割
['で見れるから、', 'で検索してね!'];
⑥ ⑤の配列で、googleのURLまでの文章とURLを、splittedMessageに入れる
splittedMessage = ['意見を', 'https://twitter.com', 'で見れるから、', 'https://google.co.jp'];
⑦ ⑤の配列で、残ったメッセージをtextEndに代入
textEnd = 'で検索してね!';
⑧ textEndにはもうURLが含まれていないので、そのままsplittedMessageに入れる
splittedMessage = ['意見を', 'https://twitter.com', 'で見れるから、', 'https://google.co.jp', 'で検索してね'];
これで、分割された配列splittedMessageが完成
이렇게 보면 좀 수다스럽지만 이것은 중복 처리 URL의 개수일 뿐이다.그런 다음 일치하는 URL 이전의 문장을 함께 배열하고 나머지 문장을 더 나누어 배열한다.
실복으로 이런 인상을 받을 수 있다.
List<String> getSplittedMessage(String message) {
final RegExp urlRegExp = RegExp(
r'((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?');
final Iterable<RegExpMatch> urlMatches =
urlRegExp.allMatches(message);
// ①
final List<String> splittedMessage = <String>[];
String textEnd = ''; // 文末(文末の分割を繰り返していく)
int count = -1; // Iterableのためcount
// messageInLineの分割
for (RegExpMatch urlMatch in urlMatches) {
count++;
// URL取得
final String url = message.substring(urlMatch.start, urlMatch.end);
List<String> splittedText;
if (count == 0) {
// ②
splittedText = messageInLine.split(url);
} else {
// ⑤
splittedText = messageEnd.split(url);
}
// ③, ⑥ url以前の文字列を分割して、splitTextsに収める
if (splittedText[0] != url) {
splittedMessage.add(splittedText[0]);
}
splittedMessage.add(url);
// ④, ⑦
messageEnd = splittedText.last;
}
// ⑧
if (messageEnd != '') {
splittedMessage.add(messageEnd);
}
return splittedMessage;
}
단, 이것은 반드시 주의해야 할 예외 등이 있고, 원래의 필요조건 등을 잘 정의할 필요가 있다.예를 들어 이 코드에 따라 진행하면
• URL이 메시지에 문자열로 연속적으로 존재하는 경우
ex) https://google.co.jphttps ://twitter.com
・같은 URL이 있는 경우(실제로 아무도 할 줄 모르는 것 같은데,)
ex) !들었어!
이런 상황은 아마 잘 분할할 수 없을 것이다.
이럴 때는 이 정보들을 따로 처리해야 한다.
총결산
처리로 쓴 말은 매우 촌스러운 일을 하고 있다.포장과 프로그램 라이브러리가 있다면 그런 물건을 사용해야 하는데 없어서 이렇게 됐어요.
참고할 수 있다면 다행이고, 추기 중에 또 다른 정보가 있다면 트위터에 남겨주세요.
Reference
이 문제에 관하여([Flutter] 메시지의 URL 식별), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/tsumayoji1102/articles/470ecbbb4cd93e4ee2d9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)