How to Find YouTube Video ID from Any YouTube URL

Learn how to extract the YouTube video ID from different types of YouTube URLs using simple methods and regex examples. Ideal for developers and marketers.

YouTube has so many types of URLs to embed the video on your site. Sometimes it’s difficult to find a single regular expression to parse all type of YouTube URL and retrieve the video ID from it.

To retrieve the video ID from the YouTube URL, use this function,

function getVideoID($url) {
    $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

Regular Expression explanation is as follows,

$pattern = '#^(?:https?://)?';    # Either http or https.
$pattern .= '(?:www\.)?';         #  Optional, www subdomain.
$pattern .= '(?:';                #  Group host alternatives:
$pattern .=   'youtu\.be/';       #    Either youtu.be,
$pattern .=   '|youtube\.com';    #    or youtube.com
$pattern .=   '(?:';              #    Group path alternatives:
$pattern .=     '/embed/';        #      Either /embed/,
$pattern .=     '|/v/';           #      or /v/,
$pattern .=     '|/watch\?v=';    #      or /watch?v=,    
$pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
$pattern .=   ')';                #    End path alternatives.
$pattern .= ')';                  #  End host alternatives.
$pattern .= '([\w-]{11})';        # Youtube video ids with standard length of 11 chars.
$pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.

Fix cPanel SoftException: GID of Script is Smaller Than min_gid

Learn how to resolve the cPanel SoftException error ‘GID of script is smaller than min_gid’. Step-by-step guide to fix permission and ownership issues.

After upgrading EasyApache in WHM, sometimes it gives 500 (Internal Server Error) error in the browser.  If you check the error_log file, you find:

SoftException in Application.cpp:363: GID of script "/home/current_user/public_html/index.php" is smaller than min_gid

OR

SoftException in Application.cpp:363: UID of script "/home/current_user/public_html/index.php" is smaller than min_uid

If you check the permission of user/group for this file, it gives you root. So, apache can’t read these files uploaded by the root user. One solution is to change the permission of user/group to your current user.

chown current_user:current_user /home/current_user/public_html/ -R

This will solve the permission related issue on your site.

References :
http://www.flynsarmy.com/2011/10/cpanel-softexception-uid-is-smaller-than-min_uid/
http://forums.eukhost.com/f15/how-solve-error-softexception-application-cpp-303-a-6205/

How to Decode HTML Entities Using jQuery?

Learn how to decode HTML entities in jQuery using smart and efficient methods. Includes working examples and cross-browser techniques.

When working with dynamic HTML content, you might encounter special characters represented as HTML entities (e.g., &lt; for <, &gt; for >). These are essential for rendering text safely in browsers, but sometimes you may need to convert them back to their original characters — a process known as decoding.

In this article, we’ll explore how to decode HTML entities using jQuery in a simple and effective way.

Why Decode HTML Entities?

Most of the browsers convert certain characters into HTML entities to avoid rendering issues or XSS attacks. For example:

  • < becomes &lt;
  • > becomes &gt;
  • & becomes &amp;
  • " becomes &quot;

If you’re extracting or manipulating HTML content through JavaScript or AJAX, you may receive entity-encoded strings. To properly display or process them, you’ll need to decode these entities to a readable format.

jQuery Method to Decode HTML Entities

jQuery itself doesn’t provide a direct function to decode HTML entities, but you can use the browser’s native HTML parsing capability by leveraging a temporary DOM element like textarea.

Example Code:

function decodeHtmlEntities(encodedStr) {
    return $('<textarea/>').html(encodedStr).text();
}

// Usage
var encoded = '&lt;p&gt;Hello World!&lt;/p&gt;';
var decoded = decodeHtmlEntities(encoded);

console.log(decoded); // Output: <p>Hello World!</p>

Explanation:

  • $('<textarea/>') creates a temporary <textarea> element.
  • .html(encodedStr) sets the HTML content with entities.
  • .text() extracts the decoded plain text.

This approach is safe and works across all modern browsers.

Alternative Vanilla JavaScript Method

If you prefer using plain JavaScript without jQuery, here’s an equivalent solution:

function decodeHtmlEntities(encodedStr) {
    var txt = document.createElement('textarea');
    txt.innerHTML = encodedStr;
    return txt.value;
}

// Usage
var decoded = decodeHtmlEntities('&amp;copy; 2025');
console.log(decoded); // Output: © 2025

This is same example in Vanilla Javascript.

Use Case Examples

Below are some examples to demostrate the usage of decodeHtmlEntities function.

Example 1: Decoding API Response

If your API is giving response in HTML entities, you can use this function to decode it.

$.get('/get-description', function(data) {
    var decoded = decodeHtmlEntities(data.description);
    $('#description').text(decoded);
});

Example 2: Decoding User Input Stored with Entities

Sometimes, we store user input data in the database with HTML encoded string. We can use this function to decode HTML entities.

var userInput = '&lt;script&gt;alert(&quot;Hi&quot;)&lt;/script&gt;';
$('#output').text(decodeHtmlEntities(userInput));

Conclusion

Decoding HTML entities is essential when you’re dealing with encoded data from the server or other sources. Using jQuery’s ability to manipulate DOM elements, you can easily decode entities without additional libraries.

This simple technique ensures that your content is displayed correctly, improving both functionality and user experience.

SPF Records for Outgoing Email: What They Are & Why They Matter

Learn what an SPF record is, why it’s essential for email deliverability, and how to configure it properly for sending outgoing emails from your domain.

When users mark messages as spam from a domain, mailbox providers can accurately identify that domain as a potential source of spam – if it has a valid SPF (Sender Policy Framework) records. SPF helps distinguish legitimate senders from spoofed ones. Conversely, if spoofed emails are flagged, SPF enables providers to maintain the domain’s reputation and ensure legitimate mail flows smoothly. Clearly, using SPF helps enhance the accuracy of spam filtering and protect email reputation.

Understand Why SPF Records Often Fails with PHP’s mail()

PHP developers frequently rely on the mail() function for sending emails. However, this approach skips SMTP authentication, making outgoing emails prone to being caught by SPF checks. What’s more, SPF only evaluates the envelope sender (the “Return-Path” header), not the “From” address users actually see. You can read about this at http://www.openspf.org/FAQ/Envelope_from_scope.

In many cases, the envelope sender defaults to the server or localhost, even when the “From” header appears to come from your domain. SPF checks then focus on the envelope sender—if it lacks a proper SPF records, the email may result in a soft fail. Gmail, for instance, might label this as a “best guess record,” which can be incorrect and hurt deliverability.

How to Fix SPF Records Soft-Fail Issues

Here are two effective solutions:

Switch to an SMTP-based mailer

Use libraries like PHPMailer to send emails via SMTP. This allows setting the envelope sender to match the “From” address, enabling proper SPF alignment.

Use sendmail parameters with PHP’s mail()

If refactoring the code is too extensive, you can still adjust the envelope sender using PHP’s mail() function with the -f or -F options in the additional parameters, for example:

mail("user@example.com",  "test subject",  "test message",  $headers,  "-F 'Example  Envelope-sender' -f returnpath@example.com");

This ensures the envelope sender matches your domain – making SPF checks pass correctly.

Conclusion

In essence, SPF plays a vital role in email deliverability and domain reputation. But to leverage it effectively, you must ensure emails send with the correct envelope sender. For PHP developers, the most reliable approach is using SMTP-based mailing; alternatively, configuring the envelope address via sendmail parameters can help bridge the gap without major code changes.

Getting Started with Vi Editor in Unix: Essential Commands & Tips

A beginner-friendly guide to using the Vi editor in Unix. Learn basic navigation, editing, and saving commands to boost your productivity in the terminal.

vi is a command-line text editor originally created for the Unix operating system.

The name vi is derived from the shortest unambiguous abbreviation for the command visual; the command in question switches the line editor ex to visual mode.

Most of the network administrators are familiar with this little editor in Unix, because they use it regularly. But, for first timers, it’s most difficult editor. First timers have to remember all commands and keys to edit a simple file.

vi has two modes, Insert mode and Command mode. In insert mode, you can add/edit the texts in file. And in command mode, you can navigate and command the editor like save, exit, copy, paste, etc.

These are the commands and keys for those who want to get familiar with vi editor.

Command to open the vi editor:

vi filename

This command creates a new file if filename is not available in current directory. By default, vi begins in command mode.

Basic Commands for vi Editor

To start the insert mode, you can use following keys:

Insert text at beginning of line:I
Insert text at cursor:i
append text after cursor:a
Append text at line end:A
Open line above cursor:O
Open line below cursor:o

To switching back, and start the Command mode, press [ESC]

Most commands execute as soon as typed except for “colon” commands which execute when you press the return key.

Cursor Movement Commands for vi Editor

For cursor movement in command mode, you can use following commands/keys:

Go to beginning of line0
Go to end of line$
Go to line number ##:##
Go to line nnG
Go to last lineG
Left 6 chars6h
Move left, down, up, righth j k l
Move left, down, up, right← ↓ ↑ →
Scroll Backward 1 screen[ctrl] b
Scroll Forward 1 screen[ctrl] f
Scroll by sentence forward/backward( )
Scroll by word forward/backwardw b
Scroll by paragraph forward/backward{ }
Scroll Up 1/2 screen[ctrl] u
Scroll Down 1/2 screen[ctrl] d

Content Edit Commands for vi Editor

For deleting/changing text/character in command mode, you can use following commands/keys:

Change wordcw
Replace one characterr
Delete worddw
Delete text at cursorx
Delete entire line (to buffer)dd
Delete (backspace) text at cursorX
Delete 5 lines (to buffer)5dd
Delete current to end of lineD
Delete lines 5-10:5,10d

You can use the following commands/keys for editing the content in command prompt:

Copy lineyy
Copy n linesnyy
Copy lines1-2 /paste after 3:1,2t3
Move lines 4-5/paste after 6:4,5m6
Paste above current lineP
Paste below current linep
Undo all changes to lineU
Undo previous commandu
Join previous lineJ
Find next string occurrencen
Search backward for string?string
Search forward forstring/string
% (entire file) s (search and replace) /old text with new/ c (confirm) g (global – all):%s/oldstring/newstring/cg
Ignore case during search:set ic
Repeat last command.

Save or Quit Commands for vi Editor

To save or quit the command mode, you can use following commands/keys:

Save changes to buffer:w
Save changes and quit vizz or :wq
Save file to new file:w file
Quit without saving:q!
Save lines to new file:10,15w file

In all of the above commands, a number n will tell vi to repeat that command n times.

:syntax on Turn on syntax highlighting
:syntax off Turn off syntax highlighting
:set number Turn on Line numbering (shorthand :set nu)
:set nonumber Turn off Line numbering (shorthand :set nonu)

:set ignorecase Ignore case sensitivity when searching
:set noignorecase Restore case sensitivity (default)