Break the job onto several steps.
The first step has to be to strip off the +353, 00 353, 011 353, +353 (0), 00 353 (0), 011 353 (0) or 0 prefix before investigating the rest of the number.
Pattern: ^(\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)(353)\)?[\s-]?)?\(?0?(?:\)[\s-]?)?([1-9]\d{1,4}\)?[\d\s-]+)((?:x|ext\.?|\#)\d{3,4})?$
Use the above pattern to extract the '353' from $2 to know that international format was used, otherwise assume national format if $2 is null.
Extract the optional extension number details from $4 and store them for later use.
Extract the NSN (including spaces, hyphens and parentheses) from $3.
Remove those spaces, hyphens and parentheses and use another more detailed RegEx pattern to validate the NSN part of the number by length and initial digits.
Don't worry about users entering mismatched brackets or random punctuation. The goal is to ensure the user entered the right number of digits to make a valid phone number. Extract and validate that number, then clean it up for display using the correct formatting rules for each number range.