정규식 질문..

정규식 질문..

QA

정규식 질문..

본문

안녕하세요! 오랜만에 질문 드리네요~ 

1644081249_3ff48c23ef6473cee37f_190x190_thumb.jpg

이렇게 된거 이미지가 있는데 이걸 정규식을 어떻게 표현해야될까요..

 

이 질문에 댓글 쓰기 :

답변 3

1644081249_3ff48c23ef6473cee37f_190x190_thumb.jpg

\d+_[a-f0-9]+_\d+x\d+_thumb\.(?:jpe?g|png|gif|bmp|webp)

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

+ PHP Manual > Function Reference > Text Processing > PCRE > PCRE Patterns > Pattern Syntax

- https://www.php.net/manual/en/reference.pcre.pattern.syntax.php

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

- https://www.php.net/manual/en/regexp.reference.repetition.php

- https://www.php.net/manual/en/regexp.reference.character-classes.php

- https://www.php.net/manual/en/regexp.reference.escape.php

\d+ ... 숫자 한 글자 이상

[a-f0-9]+ ... abcdef0123456789 한 글자 이상

\. ... 단순 마침표. [그냥 . 하면 모든 문자]

jpe?g ... jpg jpeg 매칭

 

- https://www.php.net/manual/en/regexp.reference.subpatterns.php

(jpe?g|png|gif|bmp|webp) ... jpg jpeg png gif bmp webp 중 하나

(?:패턴) ... 캡처하지 않음

 


<?php
$text = '1644081249_3ff48c23ef6473cee37f_190x190_thumb.jpg
1644120690_3ff48c23ef6473cee37f_400x300_thumb.png';
preg_match_all('/(\d+)_[a-f0-9]+_(\d+)x(\d+)_thumb(\.(?:jpe?g|png|gif|bmp|webp))/', $text, $matches);
foreach ( $matches[0] as $k=>$filename ) {
    $datetime = date('Y-m-d H:i:s', $matches[1][$k]);
    $width = $matches[2][$k];
    $height = $matches[3][$k];
    $extension = $matches[4][$k];
    echo '파일명: ', $filename, '<br>';
    echo '생성일: ', $datetime, '<br>';
    echo '크기: ', $width, 'x', $height, 'px<br>';
    echo '확장자: ', $extension, '<br><br>';
}
/* 실행 결과
파일명: 1644081249_3ff48c23ef6473cee37f_190x190_thumb.jpg
생성일: 2022-02-06 02:14:09
크기: 190x190px
확장자: .jpg
 
파일명: 1644120690_3ff48c23ef6473cee37f_400x300_thumb.png
생성일: 2022-02-06 13:11:30
크기: 400x300px
확장자: .png
*/

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

    [4] => Array
        (
        )

)

이렇게 비워있는것만 나오네요

1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
1644130573_db35ae97a0429c3e6ea7.jpg
1644130573_db35ae97a0429c3e6ea7_thumb.jpg

이렇게 형식이 랜덤으로 바껴서 저걸 이용해야되요
썸네일만 삭제 하고싶거든요
나머지 삭제하는 기능은 알아서 가능한데 썸네일 앞에보면 사이즈가 있잖아요 그것까지 없애주고 싶어서요

질문에서의 문자열과 댓글에서의 문자열이 다르죠?
"패턴"이 일치해야 하는데, 맞지 않아서 그렇습니다.
이해 없이 복사&붙여넣기만 하면 쓸 수 없어요.


<?php
$text = '1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
1644130573_db35ae97a0429c3e6ea7.jpg
1644130573_db35ae97a0429c3e6ea7_thumb.jpg';
// 숫자열_문자열[임의의 문자열].이미지확장자
preg_match_all('/\d+_[a-f0-9]+.*?\.(?:jpe?g|png|gif|bmp|webp)/', $text, $matches);
/*
Array
(
    [0] => Array
        (
            [0] => 1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
            [1] => 1644130573_db35ae97a0429c3e6ea7.jpg
            [2] => 1644130573_db35ae97a0429c3e6ea7_thumb.jpg
        )

)
*/

제가 정정 할게요 쓰다보니까 첨에 설명을 잘못했어요
일단 원본이 1644130573_db35ae97a0429c3e6ea7.jpg
이건데 이걸 이용해서
1644130573_db35ae97a0429c3e6ea7_thumb.jpg 으로 _thumb.jpg이랑
_190x190_thumb.jpg 이렇게 붙어 있는것을 빼와서 삭제처리 하고싶은거에요

그게 처음에 남긴 색상 알록달록 패턴입니다.


<?php
$text = '1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
1644130573_db35ae97a0429c3e6ea7.jpg
1644130573_db35ae97a0429c3e6ea7_thumb.jpg';
preg_match_all('/\d+_[a-f0-9]+_\d+x\d+_thumb\.(?:jpe?g|png|gif|bmp|webp)/', $text, $matches);
/*
Array
(
    [0] => Array
        (
            [0] => 1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
        )

)
*/

보면 알겠지만, 패턴에 일치하는 값만 얻습니다.

1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg > 대상
1644130573_db35ae97a0429c3e6ea7.jpg => 대상 아님
1644130573_db35ae97a0429c3e6ea7_thumb.jpg => 대상 아님

처음과 마지막, _thumb 붙는 문자열까지 구하려면 패턴을 또 바꿔야죠.
역시 지정하는 방법은 다양하지만, 댓글에 언급했던 내용 이용한 패턴 남깁니다.

<?php
$text = '1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
1644130573_db35ae97a0429c3e6ea7.jpg
1644130573_db35ae97a0429c3e6ea7_thumb.jpg';
preg_match_all('/\d+_[a-f0-9]+(?:_\d+x\d+)?_thumb\.(?:jpe?g|png|gif|bmp|webp)/', $text, $matches);
/*
Array
(
    [0] => Array
        (
            [0] => 1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
            [1] => 1644130573_db35ae97a0429c3e6ea7_thumb.jpg
        )

)
*/

이해 후 응용&활용입니다.

네~ 감사합니다 다만 이게 직접 예시를 주어진걸로 했을떄는 당연히 잘 되는데
디비에서 받아온걸로 하니까 배열에 값이 비워있게 출력되네요..
아리송해요 일단 응용해서 해결 해볼게요

댓글까지 봐야 썸네일 삭제가 목적이라는 것을 알 수 있는데
정작 어디에 있는 썸네일 삭제인지까지는 알 수 없으니
주어진 내용에 맞는 답변밖에 적을 수 없죠.
(패턴에 일치하는 문자열 구하기)

관리자 페이지의 "썸네일파일 일괄삭제"는 아닌 것 같고,
게시글 내용에 포함된 썸네일 삭제인가요?
내용에서도 지우고, 실제 파일도 지우는...

내용 확인해가며 차근차근 진행해보세요. 파이팅입니다!

일단 "_thumb.jpg" 가 기본일 것 같으니

look ahead를 사용해서 찾으면 될것 같습니다.


[0-9_a-z]+(?=_thumb.jpg)

위의 출력은 _thumb.jpg를 빼고 나오니 이 부분만 추가해서..

사이즈까지도 look ahead해 도 되고요.

매번 다시 봐야 되지만, 한번 해 본것은 다시 찾아서 이것저것 조합을 해 봅니다. 
꼭 필요한데,  진짜로 머리에 기억은 남지 않는 것이 정규식같습니다.

문제는 여기에 https://sir.kr/so_regex

답은 주로 여기에

https://www.apachezone.com/free?bo_table=free&sca=&sop=and&sfl=wr_subject&stx=%EC%A0%95%EA%B7%9C%EC%8B%9D

시간날때마다 한번씩 풀어 보면 나중에 도움이 될 것 같습니다.

원하시는 내용을 적어야 삽질을 줄일 수 있습니다.

img file 명에서 어떤 부분이 필요해서 정규식을 쓰고 싶으신 것인지...

엠엘님~ 이미지 형식이 좀 달라지거든요 랜덤인데 아래 형식이 있거든요 근데 썸네일 붙은 부분만 삭제를 하려구요

1644130573_db35ae97a0429c3e6ea7_190x190_thumb.jpg
1644130573_db35ae97a0429c3e6ea7.jpg
1644130573_db35ae97a0429c3e6ea7_thumb.jpg

단순히 문자열 치환하는 거면
str_replace()
https://www.php.net/manual/en/function.str-replace.php
를 사용하시면 될 텐데요.

아니면 thumb가 들어 있는지 검사하고 싶은 거라면
strpost()
https://www.php.net/manual/en/function.strpos.php
를 사용하시면 됩니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 78
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT