Larabel에서 특수 문자를 사용하는 필터에 SQL REGEXP(mariadb)를 사용합니다.
마리아답 버전10.4
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
이 쿼리는 전체 단어로만 검색을 제공하며 특수 문자 없이도 정상적으로 작동합니다.
예
검색 행:
foo (bar baz)
필터:
$string = "(bar";
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
오류:
SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'missing )
이제 나는 로 시도했다.addcslashes
그리고.preg_quote
나는 탈출에 성공한다.(
으로 특징짓다.preg_quote
그 문자열은 필터가 안 돼요단어 전체가 필터가 되거든요
단어 전체를 더 잘 필터링할 수 있는 제안도 감사할 것입니다.
또 하나의 예
검색 행:
foo(bar baz
필터:
$filter = 'foo(bar';
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
한다면(
검색이 작동하지 않습니다.
특별한 의미를 갖는 구두점이 많이 있다.REGEXP
줄들. (
많은 것들 중 하나일 뿐이죠
4개의 문자를 검색하는 것이 목표인 경우(bar
뒤에 "word boundary"가 있는 경우 MySQL/MariaDB 버전 및 앱에서 서버로 전송하기 위해 필요한 이스케이프가 무엇인지에 따라 다음 중 하나가 작동합니다.
\(bar[[:>:]]
\\(bar[[:>:]]
\\\\(bar[[:>:]]
[(]bar[[:>:]]
\(bar\b
\\(bar\\b
\\\\(bar\\\\b
[(]bar\b
[(]bar\\b
[(]bar\\\\b
어떤 경우에도 앱은 탈출을 해야 합니다.따라서 구두점을 삭제하는 것이 좋을 수 있습니다.
[[:<:]]bar[[:>:]]
\bbar\b
\\bbar\\b
\\\\bbar\\\\b
사용도 검토한다.LIKE "(bar"
또,FULLTEXT
색인
MATCH(col) AGAINST("bar" IN BOOLEAN MODE)
퍼포먼스를 최대화하기 위해서는 (풀텍스트 인덱스를 사용하는 것이) 최적인 경우가 있습니다.
MATCH(col) AGAINST("bar" IN BOOLEAN MODE)
AND col LIKE "(bar"
다음을 시도해 보십시오.$string = '\(bar';
regex 패턴은 언제든지 https://regex101.com/ 에서 확인할 수 있습니다.
보시는 바와 같이 ICU regex 라이브러리는 괄호를 특수하다고 간주하여 더블 슬래시 이스케이프가 필요합니다.사용.add_slashes()
는 ICU가 아닌 다른 라이브러리에서 필요한 경우 슬래시가 추가되어 적절하지 않은 문자열이 표시될 수 있기 때문에 유용하지 않습니다(둥근 괄호 제외 등).
네가 하는 게 더 나을지도 몰라escapeshellcmd()
동그란 괄호와 사각형 괄호는 모두 우연히 셸 메타 문자이지만, 달러 기호와 해시 기호도 마찬가지이기 때문에 나중에 와서 뒤에서 물릴 수 있습니다.
보다 간단한 해결책은 필요한 4개의 문자를 수동으로 교체하는 것입니다(실제로는 ( ) [하지만 완전성을 위해...]).
$string = preg_replace(
'#([(\\[\\])])#',
'\\\\\\\\\1', // Hilarious, isn't it?
$string
);
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
언급URL : https://stackoverflow.com/questions/68207679/use-sql-regexp-mariadb-for-filter-in-where-with-special-characters-in-laravel
'source' 카테고리의 다른 글
자바에서의 부울에 대한 비트 연산자의 영향 (0) | 2023.01.22 |
---|---|
jQuery를 사용하여 키 누르기 이벤트를 트리거하는 결정적인 방법 (0) | 2023.01.22 |
파일에 여러 행을 쓰려면 문자열에 새 행을 지정하려면 어떻게 해야 합니까? (0) | 2023.01.22 |
mysql은 내부 또는 외부 명령어, 프로그램 또는 배치로 인식되지 않습니다. (0) | 2023.01.22 |
boto3를 사용하여 버킷 내용 나열 (0) | 2023.01.22 |