Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12

[PHP]문자열이 어디있는지 찾을 때 strpos / stripos

내가 관리하는 사이트에는 7000여 개의 콘텐츠가 있다. 그런데 옛날에 입력된 글들은 코드가 엉망이다. 심지어 글 맨 앞에 <p>가 들어가 있지 않은 경우도 있다. 그래서 프로그래밍을 통해 보완했다. 일일이 다 입력할 수는 없으니까.(나중에는 DB를 직접 다 뜯어고칠 생각인데 아직 시간이 없다.) if(strpos($content, '&lt;p')!==0 &amp;&amp; strpos($content, '&lt;P')!==0) &nbsp;$content = '&lt;p&gt;'.$content; 코드 자체는 간단하지만 신경쓸 게 좀 있다. […]

내가 관리하는 사이트에는 7000여 개의 콘텐츠가 있다. 그런데 옛날에 입력된 글들은 코드가 엉망이다. 심지어 글 맨 앞에 <p>가 들어가 있지 않은 경우도 있다. 그래서 프로그래밍을 통해 보완했다. 일일이 다 입력할 수는 없으니까.(나중에는 DB를 직접 다 뜯어고칠 생각인데 아직 시간이 없다.)

if(strpos($content, '&lt;p')!==0 &amp;&amp; strpos($content, '&lt;P')!==0)
 &nbsp;$content = '&lt;p&gt;'.$content;

코드 자체는 간단하지만 신경쓸 게 좀 있다.

우선 strpos는 해당 문자열을 찾지 못할 경우 false를 반환하는데, PHP에서는 if 문에서 0도 false처리된다. 따라서 비교연산자를 ==로 쓰면 안 되고 ===로 써야 한다. 그래서 위 코드에서 !==라고 비교한 것이다.

==는 형 타입까지는 신경쓰지 않는 비교연산자고, ===는 형 타입까지 신경쓰는 비교연산자다.

0==false 는 true지만, 0===false는 true가 아니다.

그래서 php 설명서에서 strpos 항목을 보면 아래와 같은 설명이 있다.

Warning

이 함수는 논리 FALSE를 반환하지만, 0이나 “” 등, 논리 FALSE로 취급할 수 있는 다른 값을 반환할 수 있습니다. 자세한 정보는 논리형 섹션을 참고하십시오. 이 함수의 반환값을 확인하려면 === 연산자를 이용하십시오.

내 말이랑 같은 말이다. 문자열 위치가 맨 처음일 경우 0이 반환된다는 소리. 그래서 if문이 없다는 의미의 false랑 헷갈릴 수 있으니 꼭 ===연산자를 사용하라는 소리다.

이정도 설명했으면 될 테고.

PHP5부터는 stripos가 나왔다. 이건 대소문자 구분없이 검사할 수 있는 거다. 내가 사용하는 서버는 PHP4로 돼 있어서 stripos를 사용하지 못하고 && 연산자로 묶어서 대소문자를 검사했다.

이상.

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (2개)

  1. azki 댓글:

    strpos
    로 찾으면 스트링의 끝까지 찾게 되니까, 꽤나 비효율적이라고 볼 수 있습니다.
    처음 2글자가 ‘

    1. 녹풍 댓글:

      azki님 말씀이 맞습니다. 그렇게 고쳐야겠어요 ^^

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다